我正在运行一个活动,它必须从互联网下载一个相当大的图像,然后显示它。这是有效的:下载是通过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 ()?
使用BroadcastIntent解决。
主活动创建BroadcastReceiver, IntentFilter和progress对话框;AsyncTask分别在onPreExecute/onPostExecute中注册/取消这个接收器,并显示/取消这个对话框。
在onResume和onPause中添加额外的位,以便在活动本身不活动时不具有活动接收器。
我花了一些时间来理解这个意图广播,但在那之后,它是一个非常快速和容易的实现。
如果我理解正确,你想从异步任务更新进度条。我可能会看看异步任务的onProgressUpdate。http://developer.android.com/reference/android/os/AsyncTask.html
您的类StartShowImage
没有成员。这个对象也用于创建toast。如果你为它创建成员Activity
和构造声明你可以在调用它的公共方法之前像这样通过构造函数初始化它
private Activity context;
public StartShowImage(Activity context){
this.context=context;
}
StartShowImage object=new StartShowImage(this)
object.postUpdate();
这应该工作,你的调用类应该扩展Activity