1

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

我正在做的是在后台 AsyncTask 中一个一个地安排两个以上文件的下载。根据用户交互,UI 线程可能在任何时间点都需要其中一个文件。如果文件下载是当 UI 线程要求它时未完成,我需要显示该特定文件的下载进度..

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

4

3 回答 3

1

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

例如

 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,您可以创建一个处理程序并以这种方式将消息发布到 UI 线程。

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

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

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

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

于 2013-01-22T19:36:38.477 回答
1

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

尝试扩展线程或创建由 URI 或其他标识符参数化的可运行文件以进行下载。一旦你有了它,你就可以调用 2 个线程,这些线程将一直运行直到完成。如果您需要更新 UI(进度条),您将需要实现一个处理程序并将消息从线程发送到处理程序。例如

在主要活动类中:

   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();

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

于 2013-01-22T19:30:35.107 回答
0

您可以使用DownloadManager,但它不会在您的视图中显示进度。其他选项是使用ExecutorService并提交自定义Runnable任务。包装ExecutorService在一个自定义类中,该类维护提交的任务映射。每当需要文件时,您可以查询此类任务是否完成,还可以显示正在运行的任务的 ListView。

于 2013-01-22T20:16:06.117 回答