让外部类回调AsyncTask以进行进度更新。
|
我正在运行一项活动,该活动必须从Internet下载相当大的图像,然后显示它。可行:下载通过AsyncTask完成,并显示进度对话框。下载完成后,将调用显示图像的活动。
我的问题是实际工作是在外部类中完成的。这与其他活动调用相同的例程来获取图像。所以我不能立即调用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将必须具有某种侦听器或处理程序,或外部类可以回调的某种东西。
问题是:如何执行过程的最后一部分?什么是合适的听众?如何实现这样的监听器?侦听器最终进入哪个线程-UI线程(如.onPreExecute()和.onPostExecute())还是来自.doInBackground()的工作线程?
没有找到相关结果
已邀请:
3 个回复
先对冈蒲
好按紊叉
爆刺疤灯
并为其构造声明,则可以在调用要执行的公用方法之前,通过如下构造函数将其初始化:
这应该起作用,并且您的呼叫班级应扩展为