【问题标题】:Progress bar not updating progress line after the defined interval进度条在定义的时间间隔后未更新进度线
【发布时间】:2018-11-26 18:09:45
【问题描述】:

我有大约 3 分钟的计时器,我添加了一个 progress bar,在每个 1860 milliseconds. 之后添加 1 个进度条

所以在1860000 毫秒后它完成了进度。

问题是它在开始时填充进度条,并且不显示加载动画。

这是我的代码。

 countDownTimer=new CountDownTimer(186000, 1860) {

            public void onTick(long millisUntilFinished) {

                progressBar.setProgress(time+=1);
                Log.d("seconds remaining: ", String.valueOf(time));
            }

            public void onFinish() {
                finish();
                time=0;
            }
        }.start();

    }

布局文件

<ProgressBar
    android:id="@+id/progressBar"
    style="@style/Widget.AppCompat.ProgressBar.Horizontal"
    android:layout_width="0dp"
    android:layout_height="4dp"
    android:layout_marginTop="30dp"
    android:max="100"
    android:progressDrawable="@drawable/progressbar_background"
    app:layout_constraintEnd_toStartOf="@+id/guideline9"
    app:layout_constraintHorizontal_bias="0.0"
    app:layout_constraintStart_toStartOf="@+id/guideline10"
    app:layout_constraintTop_toBottomOf="@+id/imageView19" />

如果我删除progressDialog.setProgress() 方法,它会显示空的进度条,如果我添加这一行,progress bar 会在开始时自动填充。

【问题讨论】:

  • 你从哪里得到变量“时间”?它的价值是什么?
  • 开始时为 0
  • 您使用的是单独的线程吗?在这种情况下,您应该考虑使用 runOnUiThread 活动的方法,即使 CoundDownTimer 使用内部处理程序。您能否显示创建 CountDownTimer 的完整代码?
  • 另外,您是否尝试过在 XML 布局元素中添加 android:progress=0?
  • 我在主 UI 线程中单击按钮时启动它。我也试过设置10 &amp; 5的值,但如果我设置任何值,它只会填满整个进度条

标签: android android-layout android-progressbar


【解决方案1】:

我认为问题在于您使用了一个变量time,它是在匿名类CountDownTimer 的范围之外声明和初始化的。您可以通过在调试模式下运行 System.out.printnln(time) 来检查 time 是否在 CountDownTimer 中具有正确的值,然后再调用 setProgress

要确保您在进度栏中设置的值是正确的,只需执行以下操作:

progressBar.setProgress(100 - millisUntilFinished *100 /186000)

【讨论】:

    【解决方案2】:

    你应该设置进度条:

    <ProgressBar
        ...
        android:max="1860000"
        />
    

    然后onTick(),调用:

    progressBar.setProgress(time+=1860);
    

    【讨论】:

    • 另外,正如@dglozano 所建议的,您可能需要执行 setProgress(0);初始化时。
    • 如果你把一个常数值作为进度,比如1860,它将被固定在那个值中。您应该根据 onTick 回调中剩余的毫秒数来设置进度。
    • 哦,是的!确实如此。已编辑。
    【解决方案3】:

    您可以为此使用异步任务,代码如下:

    import android.os.AsyncTask;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.util.Log;
    import android.widget.ProgressBar;
    
    public class MainActivity extends AppCompatActivity {
    
        private ProgressBar progressBar;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            progressBar = findViewById(R.id.progressBar);
    
            LongTask timer = new LongTask();
            timer.execute();
        }
    
        private class LongTask extends AsyncTask<Void, Integer, Void> {
    
            private static final int INTERVAL = 1860;
    
            @Override
            protected Void doInBackground(Void... params) {
                for (int i = 0; i <= 100; i++) {
                    publishProgress(i);
                    try {
                        Thread.sleep(INTERVAL);
                    } catch (InterruptedException e) {
                        Thread.interrupted();
                    }
    
                    Log.d("Milliseconds elapsed: %s", String.valueOf(i * INTERVAL));
                }
    
                return null;
            }
    
            @Override
            protected void onPostExecute(Void result) {}
    
            @Override
            protected void onPreExecute() {}
    
            @Override
            protected void onProgressUpdate(Integer... values) {
                int progress = values[0];
                progressBar.setProgress(progress);
            }
        }
    }
    

    【讨论】:

    • 使用CountDownTimer 的想法是避免这种样板。在内部,它有自己的 Handler,因此如果它不对 onTick 进行任何昂贵的操作,则无需在不同的线程中运行它。更多信息android.jlelse.eu/…
    猜你喜欢
    • 2012-02-02
    • 2022-12-03
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-21
    • 2013-03-08
    相关资源
    最近更新 更多