为什么在循环中调用publishProgress,并多次调用它(没有循环),显示不同的行为?

时间:2015-08-21 12:18:42

标签: android multithreading android-asynctask progress-bar android-progressbar

我正在使用this libraryonProgressUpdate 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.";
    }

第二种方式更适合我的应用。所以问题是为什么!以及如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

方法setProgress(int);无法顺利更新进度条。 如果最大值为100,则当您将进度设置为30时,它将直接显示填充的进度为30%。

在你的第一个代码示例中,它看起来很平滑,因为你有1个非常60毫秒。

您应该添加更多步骤或使用真正的进度值(例如下载百分比)。