我正在使用this library在onProgressUpdate
AsyncTask
方法的活动用户界面中显示ProgressBar。
所以我为此写了一篇SSCCE。 doInBackground()
内的问题当我在循环中调用Thread.sleep(60)
迭代100次并在每次迭代中调用publishProgress(i)
时,我可以看到DeterminateProgressBar
按顺序填充颜色(按照以下步骤显示颜色的动画),如下所示
@Override
protected void onProgressUpdate(Integer... values) {
progressBarDeterminate.setProgress(values[0]);
}
@Override
protected String doInBackground(Void... voidArgs) {
((MainActivity) context).runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(context, "doInBackground of MyTask called", Toast.LENGTH_SHORT).show();
}
});
for(int i = 0; i <= 100; i++){
try {
//publishProgress(i);
Thread.sleep(60);
} catch (InterruptedException e) {
e.printStackTrace();
}
publishProgress(i);
}
}
但是当我离开循环时,只需拨打Thread.sleep(60)
,然后publishProgress(30)
,然后Thread.sleep(60)
,然后publishProgress(60)
,然后Thread.sleep(60)
,然后publishProgress(100)
,我看不到ProgressBar
顺序进展,而只是在doInBackground
结束时只用一步填充颜色。
@Override
protected void onProgressUpdate(Integer... values) {
progressBarDeterminate.setProgress(values[0]);
}
@Override
protected String doInBackground(Void... voidArgs) {
((MainActivity) context).runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(context, "doInBackground of MyTask called", Toast.LENGTH_SHORT).show();
}
});
try {
Thread.sleep(60);
} catch (InterruptedException e) {
e.printStackTrace();
}
publishProgress(30);
try {
Thread.sleep(60);
} catch (InterruptedException e) {
e.printStackTrace();
}
publishProgress(60);
try {
Thread.sleep(60);
} catch (InterruptedException e) {
e.printStackTrace();
}
publishProgress(100);
return "doInBackground of MyTask returning.";
}
第二种方式更适合我的应用。所以问题是为什么!以及如何解决这个问题?
答案 0 :(得分:2)
方法setProgress(int);
无法顺利更新进度条。
如果最大值为100,则当您将进度设置为30时,它将直接显示填充的进度为30%。
在你的第一个代码示例中,它看起来很平滑,因为你有1个非常60毫秒。
您应该添加更多步骤或使用真正的进度值(例如下载百分比)。