gpt4 book ai didi

android - 让外部类回调 AsyncTask 进行进度更新

转载 作者:行者123 更新时间:2023-11-29 22:26:44 25 4
gpt4 key购买 nike

我正在运行一个 Activity ,它必须从 Internet 下载相当大的图像,然后显示它。这有效:下载是通过 AsyncTask 完成的,并显示一个进度对话框。下载完成后,将调用显示图像的 Activity。

我遇到的问题是真正的工作是在外部类中完成的。这与其他 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 是一个 bool 值,用于跟踪此 Activity 是否处于 Activity 状态 - 它在 onCreate 和 onResume 中设置,在 onPause 中取消设置。

我一直在研究广播 Intent - 我已经看到一个关于如何将这样的 Intent 发送回主要 Activity 的示例,但问题是必须在 onResume/onPause 中注册/注销监听器 -而 AsyncTask 是一个单独的线程。所以看起来这种方法不能那样安全地使用。

编辑重述问题,希望得到解决我问题的答案。

AsyncTask 设置进度对话框。

onExecute() 线程可以直接更新进度对话框。没问题。

实际工作是在外部类中完成的,因此该外部类知道进度信息,该外部类必须以某种方式将其传回 AsyncTask。

AsyncTask 必须有某种监听器或处理程序,或外部类可以回调的东西,以便提供进度更新。

问题是:如何执行流程的最后一部分?什么是合适的倾听者?如何实现这样的监听器?监听器最终进入哪个线程 - 像 .onPreExecute() 和 .onPostExecute() 这样的 UI 线程,还是来自 .doInBackground() 的工作线程?

最佳答案

通过使用 BroadcastIntent 解决。

主要 Activity 创建BroadcastReceiver、IntentFilter和进度对话框; AsyncTask 注册/取消注册此接收器并分别在 onPreExecute/onPostExecute 中显示/关闭对话框。

在 onResume 和 onPause 中添加额外的位,以便在 Activity 本身处于非 Activity 状态时没有 Activity 的接收器。

我花了一段时间才理解这个 Intent 广播,但之后这是一个非常快速和简单的实现。

关于android - 让外部类回调 AsyncTask 进行进度更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5694696/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com