在从互联网下载数据所需的时间内,在AsyncTask的onProgressUpdate中显示确定的ProgressBar

时间:2015-08-20 10:17:56

标签: android android-asynctask progress-bar handler async-onprogressupdate

我正在尝试使用this library在AsyncTask的onProgressUpdate()的“活动”屏幕上发布进度,该屏幕用于从互联网下载一些数据。他们提供的演示应用程序使用Handler来演示这一点。我需要在AsyncTask中使用它。

以下代码段来自其演示应用程序中的代码。

我的问题是:

  1. onProgressUpdate获取参数Progress... values,和 根据{{​​3}},它是“指示的值 进展。“但我不明白这意味着什么,以及如何 使用这个论点。在我看到的例子中,他们正在做 类似的东西:

    progressBar.setProgress(Integer.parseInt(values[0]));
    

    为什么他们只在传递的数组中使用第一个值 (值[ 0 ])?

  2. AsyncTask如何知道完成需要多长时间 下载操作。我想展示ProgressBar的进展 在完成下载所花费的时间内,值为0到100 操作。

    通过执行progressBarDeterminate.setVisibility(View.VISIBLE) onPreExecute并且正在做 progressBarDeterminate.setVisibility(View.GONE) in onPostExecute,我们确保它只显示数据的时间 正在下载,但我们如何确保它的进展 在所需的时间内开始到最终位置 下载数据 (当我们不确切知道它有多长时间 打算下载数据)?

  3. CODE FROM DEMO示例(它使用Handler,但我需要在AsyncTask中执行此操作)

    public class MainActivity extends AppCompatActivity {
        ProgressBarDeterminate progressBarDeterminate;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            setContentView(R.layout.activity_main);
            progressBarDeterminate = (ProgressBarDeterminate) findViewById(R.id.progressDeterminate);
    
            progressTimer.start();
        }
    
    
            Thread progressTimer = new Thread(new Runnable() {
    
                    @Override
                    public void run() {
                        for(int i = 0; i <= 100; i++){
                            try {
                                Thread.sleep(30);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                            handler.sendMessage(new Message());
                        }
                    }
                });
    
                Handler handler = new Handler(new Handler.Callback() {
                    int progress = 0;
                    @Override
                    public boolean handleMessage(Message msg) {
                        progressBarDeterminate.setProgress(progress++);
                        return false;
                    }
                });
    }
    

1 个答案:

答案 0 :(得分:1)

在回答您的第一个问题时,onProgressUpdate ()会采用 varargs 参数。这意味着它可以使用指定类型的无限数量的参数。例如:

public void someMethod(String... args) {
    //...
}

可以像这样调用,someMethod("Hi!")或此someMethod("Hi", "there", "welcome", "to", "SO")

有关 varargs 的更多信息,请here。这些参数的访问方式与数组相同。如果那里只有一个参数,那么你可以使用args[0]

修改 关于您的第二个问题,Android开发者javadocs中提供了一个很好的示例:

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
     protected Long doInBackground(URL... urls) {
         int count = urls.length;
         long totalSize = 0;
         for (int i = 0; i < count; i++) {
             totalSize += Downloader.downloadFile(urls[i]);
             publishProgress((int) ((i / (float) count) * 100));
             // Escape early if cancel() is called
             if (isCancelled()) break;
         }
         return totalSize;
     }

     protected void onProgressUpdate(Integer... progress) {
         setProgressPercent(progress[0]);
     }

     protected void onPostExecute(Long result) {
         showDialog("Downloaded " + result + " bytes");
     }
 }

即答案真的取决于你的情况。在上面的例子中说你需要下载十个URL。设置for循环以按顺序下载每个URL,并且在URL完成后,调用publishProgress(),将当前值转换为百分比数字,{ {1}}。希望能回答你的问题!