让外部类回调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()的工作线程?     
已邀请:
通过使用BroadcastIntent解决。 主要活动创建了BroadcastReceiver,IntentFilter和进度对话框; AsyncTask注册/注销此接收者,并分别在onPreExecute / onPostExecute中显示/关闭对话框。 当活动本身处于非活动状态时,onResume和onPause中的额外位将没有活动的接收器。 我花了一些时间来了解这种意图广播,但是在那之后,这是一个非常快速,容易的实现。     
如果我理解正确,那么您想从异步任务更新进度条。我可能会看一下异步任务的onProgressUpdate。 http://developer.android.com/reference/android/os/AsyncTask.html     
您的课程“ѭ1”没有成员。您还用来创建烤面包的对象。如果使成员
Activity
并为其构造声明,则可以在调用要执行的公用方法之前,通过如下构造函数将其初始化:
private Activity context;
public StartShowImage(Activity context){
    this.context=context;
}

StartShowImage object=new StartShowImage(this)
object.postUpdate();
这应该起作用,并且您的呼叫班级应扩展为
Activity
    

要回复问题请先登录注册