0

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

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

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

任何人都可以在这里帮助我,给我一些教程或深入研究的东西吗?

待定;我什至不确定 AsyncTask 是否是我在这种情况下要寻找的。基本上我需要一些可以下载资源,放入队列,并让我知道整个队列的进度,以及在特定时间下载的资源(它的名称)的东西。

谢谢!

4

5 回答 5

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

我希望这能帮到您。如果您有任何问题,请发表评论。

于 2012-08-06T10:09:27.363 回答
1

AsyncTask 不应该用于长时间运行的下载。AsyncTasks 真正与 UI 有关,重要的是要知道用户导航甚至旋转屏幕都会终止下载。

您应该使用服务来执行下载,因此将所有下载代码放入 IntentService 并更新某种持久存储以指示进度(共享首选项中的几个变量会很好(指示当前状态,另一个指示进度))。

然后,您可以使用您的活动来启动服务,然后通过持久存储或通过意图传递的一些回调监视下载进度(持久存储可能是最简单的)。

于 2012-08-06T10:09:41.100 回答
0

AsyncTask 正是您正在寻找的,您可以根据 API 对任务数量进行排队,如果有队列大小的 getter,我将检查 Asynctask 实现,但如果没有,您可以列出 asyncTask 并更新当它完成时。

如果您排队 15 个任务,您可以将进度条设置为最大 15 个,并且在每个 onPostExecute 增加 progressBar :)

我稍后会检查队列并编辑我的答案。

问候。

于 2012-08-06T10:03:47.820 回答
0

AsyncTask 非常符合您的要求。您只能针对当前对象进行更新,这并不是真的。这意味着您可以更新当前的 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)并相应地更新 2 个不同的进度条onProgressUpdate

您完成所有下载,doInBackground并且每次您想要更新进度条/条时,调用publishProgress将您的进度整数传递给onProgressUpdate.

于 2012-08-06T10:08:57.980 回答
-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);
                     }
                 });
}
于 2012-08-06T10:14:52.317 回答