我还没有开始编码。我正在试图弄清楚那里有哪些库以及API可以提供什么。
我需要在启动应用程序之前下载大量资源。基本上我将有一个“SplashSreen”和一个进度条,显示正在下载哪个文件以及整个下载x-number资源的进度条。
在查看了有关该主题的一些讨论和教程之后,在我看来,AsyncTask将完成这项工作。但是,只能显示当前正在下载的“对象”的当前进度,而不是整个队列。
有人可以帮助我,给我一些教程或者可以深入研究的内容吗?
TBH;我甚至不确定AsyncTask是否是我在这个场景中寻找的东西。基本上我需要能够下载资源,放入队列,让我知道整个队列的进度以及在特定时间下载哪个资源(名称)的东西。
谢谢!
答案 0 :(得分:2)
当然AsyncTask
可以完成这项工作。只需将所有文件放在asyncTask中即可显示进度。
class InitTask extends AsyncTask<Void, Integer, Boolean> {
private List<String> mNbFiles;
public InitTask(List<String> filesURL)
{
super();
mFilesURL = filesURL;
}
@Override
protected void onPreExecute() {
//show and init your progress bar here...
super.onPreExecute();
}
@Override
protected Boolean doInBackground(Void... params) {
for(int i = 0 ; i < mNbFiles.size() ; ++i){
//download one file ...
publishProgress(i);
}
}
}
我希望这会对你有所帮助。如果您有任何疑问,请发表评论。
答案 1 :(得分:1)
AsyncTask不是您应该用于长时间运行的下载。 AsyncTasks实际上是关于UI的,重要的是要知道用户导航甚至旋转他们的屏幕都会导致下载。
您应该使用服务来执行下载,因此将所有下载代码放入IntentService并更新某种持久存储以指示进度(共享首选项中的几个变量可以正常运行(表示当前状态,另一个表示进展))。
然后,您可以使用您的活动启动服务,然后通过持久存储监控下载进度或通过意图传递一些回调(持久存储可能最简单)。
答案 2 :(得分:0)
AsyncTask正是您所寻找的,您可以根据API排队任务量,如果有队列大小的getter,我将检查Asynctask实现,但如果没有,您可以列出asyncTask并在完成时更新。
如果排队15个任务,可以将进度条设置为最大值15,并在每个onPostExecute上增加progressBar:)
我稍后会检查队列并编辑我的答案。
问候。
答案 3 :(得分:0)
AsyncTask非常适合您。那不是真的只能更新当前的Object。这意味着您可以更新当前的AsyncTask。
以下是onProgressUpdate
方法。
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
Log.i(logTag, "onProgressUpdate: " + String.valueOf(values[0]));
View view = getView();
if(view != null)
((ProgressBar)view.findViewById(R.id.progressBar)).setProgress(values[0]);
}
您会看到它需要任意数量的整数作为参数。在publishProgress
方法中,您可以致电onProgressUpdate(itemProgress, totalProgress)
,然后在onProgressUpdate
中相应更新2个不同的进度条。
您在doInBackground
进行所有下载,并且每次要更新进度条/栏时,请致电publishProgress
,将您的进度内容传递给onProgressUpdate
。
答案 4 :(得分:-1)
在AsyncTask中,doInBackground()方法将您的代码下载所有对象并使用处理程序发布进度条的更新。看一下这个例子:
http://developer.android.com/reference/android/widget/ProgressBar.html
以下代码进入doInBackground():
while (mProgressStatus < 100) {
mProgressStatus = doWork();
// Update the progress bar
mHandler.post(new Runnable() {
public void run() {
mProgress.setProgress(mProgressStatus);
}
});
}