优雅的方案?

时间:2010-10-25 15:31:19

标签: java android parallel-processing

优雅的解决方案

嘿,人们。 我正在研究一个项目,我正在考虑一个优雅的实施解决方案,我已经厌倦了即兴的解决方案。

让我试着向你解释我的“问题”:

我的应用程序的这一部分的任务非常简单:

我希望我的应用程序下载一些内容并在后台处理下载的文件,同时显示ProgressDialog。之后,应该在一些ListActivity中显示的字符串列表中返回内容。到目前为止,没什么大不了的:

Downloader和处理内容是一个子类AsyncTask,并在一个与主Activity不同的类中调用。但现在我的问题是:

在哪里调用Progressdialog? GUI-Thread如何与ProgressDialog“做出反应”?我应该从处理类调用ProgressDialog还是更好地“阻止”主类,等待通知?

问候

EnflamedSoul

2 个答案:

答案 0 :(得分:2)

尽管我不会使用处理程序来处理更新进度,但是blindstuffs anwser正朝着正确的方向前进。 AsyncTask有自己的函数来处理这个问题,它们更容易使用,更适合AsyncTask类

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
    protected Long doInBackground(URL... urls) {
    int count = urls.length;
    long totalSize = 0;
    for (int i = 0; i < count; i++) {
        totalSize += Downloader.downloadFile(urls[i]);
        publishProgress((int) ((i / (float) count) * 100));
    }
    return totalSize;
    }

    protected void onProgressUpdate(Integer... progress) {
        setProgressPercent(progress[0]);
    }

    protected void onPostExecute(Long result) {
        showDialog("Downloaded " + result + " bytes");
    }
}

此示例取自official Android SDK documentation。使用publishProgress的优点是您可以传递多个值,具体取决于传入doInBackground的参数数量(即,如果您下载的文件超过1个)。

答案 1 :(得分:0)

将进度对话框定义为全局变量。

ProgressDialog pd;

你要在哪里开启asyncTask:

showYourProgressDialog;
thread = new aThread().execute();

在你班上:

public class aThread extends AsyncTask<Void, Void, Void> {
        @Override
        protected Void doInBackground(Void... args) {
            try {
                //Do your downloading and stuff
                                asyncHandler.sendMessage(asyncHandler.obtainMessage(0));
            } catch (Exception e) {
                Log.e("1", "Error", e);
            }
            return null;
        }
    }

Handler asyncHandler = new Handler() {
        public void handleMessage(Message msg) {
            pd.dismiss();
            if (msg.what == 0) {
                //update what you need to               
            }           
        }
    };