我在这里问了一个类似的问题AsyncTask and Progressbar。
我正在做的是我正在安排在后台AsyncTask中逐个下载两个以上的文件.UI线程可能在任何时间点都需要其中一个文件,具体取决于用户的交互。如果当UI线程请求文件下载不完整时,我需要显示该特定文件的下载进度..
我已经看到了一些关于显示特定文件下载进度条的答案。但我的要求有所不同。我需要跟踪后台发生的文件下载进度。
答案 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。