【发布时间】:2011-04-17 16:21:32
【问题描述】:
我正在运行一个活动,它必须从 Internet 下载一个相当大的图像,然后显示它。这可行:下载是通过 AsyncTask 完成的,并显示一个进度对话框。下载完成后,会调用显示图像的 Activity。
我遇到的问题是真正的工作是在外部类中完成的。这与其他活动调用相同的例程来获取图像一样。所以我不能立即调用 postUpdate() 来设置更新,因为这个调用将在另一个类中完成。现在我想知道如何将进度更新返回到我的 AsyncTask,以便我的进度对话框可以显示实际进度
AsyncTask 子类目前如下所示:
private class StartShowImage extends AsyncTask<String, Integer, String> {
private ProgressDialog dialog;
@Override
protected void onPreExecute() {
// Toon een dialog met draaiend wiel terwijl we de foto
// aan het ophalen zijn.
dialog = new ProgressDialog(ShowDeaddrop.this);
dialog.setTitle(R.string.progress_dialog_title);
dialog.setMessage(getResources().getString(
R.string.progress_dialog_fetching_image));
dialog.show();
}
/**
* De hoofdroutine; haalt de foto op.
*/
@Override
protected String doInBackground(final String... params) {
final String imageName = params[0];
String result = null;
try {
result = DeaddropUtil.getImage(context, imageName, ""
+ deaddropID, true);
} catch (final IOException e) {
Log.v(TAG, "Failed to download image " + imageName);
Log.v(TAG, "" + e);
}
return result;
}
/**
* Als we de foto hebben, start ShowImage.
*/
@Override
protected void onPostExecute(final String imageName) {
dialog.dismiss();
if (isActive)
if (imageName == null)
Toast.makeText(context, R.string.toast_show_image_failed,
Toast.LENGTH_SHORT).show();
else {
final Intent i = new Intent(ShowDeaddrop.this,
ShowImage.class);
i.putExtra("imageName", imageName);
startActivityForResult(i, SHOW_IMAGE);
}
}
}
isActive 是一个布尔值,用于跟踪此活动是否处于活动状态 - 它在 onCreate 和 onResume 中设置,在 onPause 中取消设置。
我一直在研究广播意图 - 我已经看到了一个关于如何将这样的意图发送回主要活动的示例,但问题是监听器必须在 onResume/onPause 中注册/取消注册 -而 AsyncTask 是一个单独的线程。所以看来这种方法不能安全使用。
编辑重述问题,希望得到解决我问题的答案。
AsyncTask 设置进度对话框。
onExecute() 线程可以直接更新进度对话框。没问题。
实际工作是在一个外部类中完成的,因此该外部类知道进度信息,它必须以一种或另一种方式将其传回给 AsyncTask。
AsyncTask 必须有某种监听器、处理程序或外部类可以回调的东西,以便提供进度更新。
问题是:如何执行该过程的最后一部分?什么是合适的听众?如何实现这样的监听器?监听器最终进入哪个线程 - 像 .onPreExecute() 和 .onPostExecute() 这样的 UI 线程,还是来自 .doInBackground() 的工作线程?
【问题讨论】:
标签: android progress-bar android-asynctask