跟踪AsyncTask中文件下载的进度

时间:2013-01-22 19:16:01

标签: android android-asynctask android-progressbar

我在这里问了一个类似的问题AsyncTask and Progressbar

我正在做的是我正在安排在后台AsyncTask中逐个下载两个以上的文件.UI线程可能在任何时间点都需要其中一个文件,具体取决于用户的交互。如果当UI线程请求文件下载不完整时,我需要显示该特定文件的下载进度..

我已经看到了一些关于显示特定文件下载进度条的答案。但我的要求有所不同。我需要跟踪后台发生的文件下载进度。

3 个答案:

答案 0 :(得分:1)

每次下载都应该在自己的线程上运行(如果一个文件较小,一个服务器速度较快等)。

尝试扩展线程或创建由URI或其他下载标识符参数化的runnable。完成后,您可以调用2个线程,直到完成为止。如果需要更新UI(进度条),则需要实现处理程序并将消息从线程发送到处理程序。 e.g。

在主要活动类中:

   public static final int UPDATE_PROGRESS_BAR =0; 
   public final Handler uiHander = new Handler(){
         public void handleMessage(Message msg){
            switch(msg.what){
            case UPDATE_PROGRESS_BAR: // Something like this to handle the case of progress bar update
                 int updateAmount = msg.obj;
                 // do something to update prog. bar
                 break;

然后在线程中发送该消息,它需要对处理程序的引用

     uiHander.obtainMessage(<activity name>.UPDATE_PROGRESS_BAR,<integer update>).sendToTarget();

这可能是最便携的方式,因为异步任务实现已将版本更改为版本,并且可能会也可能不会并行执行这两个下载(您显然需要)

答案 1 :(得分:1)

当您使用AsyncTask时,您可以选择使用onProgressUpdate(Progress ...),在调用publishProgress(Progress ...)后在UI线程上调用。

E.g。

 private class DownloadFilesTask extends AsyncTask<File, Integer, Long> {
 protected Long doInBackground(File... file) {
     // This will call onProgressUpdate
     publishProgress((int) ((i / (float) count) * 100));
 }

 // this will be called on the UI thread
 protected void onProgressUpdate(Integer... progress) {
     setProgressPercent(progress[0]);
 }

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

如果你没有使用AsyncTask,你可以创建一个Handler并以这种方式将消息发布到UI线程。

但是当你提到文件下载时需要考虑一些事情(来自Android文档): -

  • 设备可能没有足够的空间容纳扩展文件,因此您应该在开始下载之前进行检查,并在空间不足时警告用户。
  • 文件下载应在后台服务中进行,以避免阻止用户交互,并允许用户在下载完成时离开您的应用。
  • 在您必须正常处理的请求和下载过程中可能会发生各种错误。
  • 下载过程中网络连接可能会发生变化,因此您应该处理此类更改,如果中断,请尽可能恢复下载。
  • 在后台进行下载时,您应该提供一个指示下载进度的通知,在用户完成时通知用户,并在选择后将用户带回您的应用程序。

幸运的是,上述所有内容都包含在Google的图书馆中,该图书馆提供下载及进度通知(即使您退出应用)。您可以使用它,或根据自己的需要修改源。更多信息在这里

http://developer.android.com/google/play/expansion-files.html#AboutLibraries

答案 2 :(得分:0)

您可以使用DownloadManager,但不会在您的视图中显示进度。其他选项是使用ExecutorService并提交自定义Runnable任务。将ExecutorService换行到维护提交的任务地图的自定义类中。无论何时需要文件,您都可以查询此类是否完成任务,还显示正在运行的任务的ListView。