AsyncTask队列及其整个进度

时间:2012-08-06 09:57:36

标签: android android-asynctask task-queue

我还没有开始编码。我正在试图弄清楚那里有哪些库以及API可以提供什么。

我需要在启动应用程序之前下载大量资源。基本上我将有一个“SplashSreen”和一个进度条,显示正在下载哪个文件以及整个下载x-number资源的进度条。

在查看了有关该主题的一些讨论和教程之后,在我看来,AsyncTask将完成这项工作。但是,只能显示当前正在下载的“对象”的当前进度,而不是整个队列。

有人可以帮助我,给我一些教程或者可以深入研究的内容吗?

TBH;我甚至不确定AsyncTask是否是我在这个场景中寻找的东西。基本上我需要能够下载资源,放入队列,让我知道整个队列的进度以及在特定时间下载哪个资源(名称)的东西。

谢谢!

5 个答案:

答案 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);
                     }
                 });
}