我在这里问了一个类似的问题AsyncTask 和 Progressbar。
我正在做的是在后台 AsyncTask 中一个一个地安排两个以上文件的下载。根据用户交互,UI 线程可能在任何时间点都需要其中一个文件。如果文件下载是当 UI 线程要求它时未完成,我需要显示该特定文件的下载进度..
我已经看到了一些关于显示特定文件下载进度条的安静答案。但我的要求有些不同。我需要跟踪后台文件下载的进度。
我在这里问了一个类似的问题AsyncTask 和 Progressbar。
我正在做的是在后台 AsyncTask 中一个一个地安排两个以上文件的下载。根据用户交互,UI 线程可能在任何时间点都需要其中一个文件。如果文件下载是当 UI 线程要求它时未完成,我需要显示该特定文件的下载进度..
我已经看到了一些关于显示特定文件下载进度条的安静答案。但我的要求有些不同。我需要跟踪后台文件下载的进度。
当您使用 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
每个下载都应该在自己的线程上运行(如果一个文件更小,一个服务器更快等)。
尝试扩展线程或创建由 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();
这可能是最便携的方式,因为异步任务实现已将版本更改为版本,并且可能会或可能不会并行执行两个下载(您显然想要)
您可以使用DownloadManager
,但它不会在您的视图中显示进度。其他选项是使用ExecutorService
并提交自定义Runnable
任务。包装ExecutorService
在一个自定义类中,该类维护提交的任务映射。每当需要文件时,您可以查询此类任务是否完成,还可以显示正在运行的任务的 ListView。