【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
我正在尝试编写一个易于更新的简单应用程序。 为此,我需要一个简单的函数,该函数可以下载文件并在ProgressDialog
显示当前进度 。 我知道如何执行ProgressDialog
,但是我不确定如何首先显示当前进度以及如何下载文件。
#1楼
是的,上面的代码可以工作。但是,如果您要在Asynctask
onProgressUpdate
中更新progressbar
,然后按返回按钮或完成活动,则AsyncTask
与UI失去联系。当您返回活动时,即使正在运行下载,后台,您将不会在进度栏上看到任何更新。 因此,在OnResume()
尝试使用计时器任务运行类似runOnUIThread
的线程,该计时器任务使用从AsyncTask
运行后台更新的值来更新progressbar
。
private void updateProgressBar(){
Runnable runnable = new updateProgress();
background = new Thread(runnable);
background.start();
}
public class updateProgress implements Runnable {
public void run() {
while(Thread.currentThread()==background)
//while (!Thread.currentThread().isInterrupted()) {
try {
Thread.sleep(1000);
Message msg = new Message();
progress = getProgressPercentage();
handler.sendMessage(msg);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} catch (Exception e) {
}
}
}
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
progress.setProgress(msg.what);
}
};
当您的活动不可见时,别忘了销毁线程。
private void destroyRunningThreads() {
if (background != null) {
background.interrupt();
background=null;
}
}
#2楼
我的个人建议是使用进度对话框并在执行之前进行构建,或者在OnPreExecute()
处启动,如果您使用进度对话框的进度条的水平样式,则经常发布进度。 剩下的部分是优化doInBackground
的算法。
#3楼
不要忘记用新文件 (“ / mnt / sdcard / ...”)替换“ / sdcard ...”,否则您将得到FileNotFoundException
#4楼
我建议您使用基于Volley的 Project Netroid 。 我添加了一些功能,例如多事件回调,文件下载管理。 这可能会有帮助。
#5楼
我发现此博客文章非常有帮助,它使用loopJ下载文件,它只有一个Simple函数,将对一些新的android有用。
来源:oschina
链接:https://my.oschina.net/u/3797416/blog/3142726