将AsyncTask的结果返回给其实例化变量

时间:2011-08-17 04:13:19

标签: android android-asynctask

我已经构建了一个完全工作的AsyncTask来处理设备授权,但唯一的问题是我很难将生成的Bundle恢复到其实例化变量以继续处理主活动。这是AsyncTask实例化:

Bundle taskResult = new AuthorizeDevice(this).execute(passToAuthroization).get();

我已经阅读了一些关于这个主题的文献,并发现onPostExecute()方法可能与此有关,所以考虑到这一点:

protected void onPostExecute(Bundle result){
    dialog.dismiss();
    Toast.makeText(context, "background process finished: "+result.getString("UDID"), Toast.LENGTH_SHORT).show();
}

那么如何将该捆绑包带回主要活动?

4 个答案:

答案 0 :(得分:2)

AsyncTask是一个非阻塞调用,你不能按照你想要的方式获取bundle。但是,您可以做的是在AsyncTask中创建一个接口,它将告诉您何时完成。像onTaskComplete这样的东西,你可以在那里传递结果包。

答案 1 :(得分:1)

将回调接口定义为

public interface AuthorisationCallback() {
      void onFinish(Bundle bun);
};

实现此界面并使用捆绑包执行任何操作。

AuthorisationCallback mAuthcallback = new AuthorisationCallback() {
    void onFinish(Bundle bun) {
        // Do what ever with the bundle.
    }
};

将其实现引用发送到AsyncTask

new AuthorizeDevice(mAuthcallback).execute(passToAuthroization);

在onPostexecute()中执行

protected void onPostExecute(Bundle result){
    dialog.dismiss();
    mCallback.onFinish(result);
}

答案 2 :(得分:1)

首先,仔细看看API。

我需要查看更多代码才能知道您要执行的操作,但PravinCG是正确的,您使用AsyncTask.execute()调用的方式不正确。如果您想要返回值,请从onPostExecute()

获取

看起来你已经开始使用AsyncTask<?,?,?>进行子类化了,如果你需要访问你的Activity,你能不能简单地将AsyncTask子类放在Activity类中?这将允许您从onPostExecute()中访问您的Activity的方法,这在设计上在UI线程上发生。 (再次,需要查看更多代码才能知道这是多么可行,只需将其放在那里)。 如果没有,只需将对Activity的引用传递给AsyncTask子类,并使用公共方法从onPostExecute返回Bundle,或者使用已建议的接口......

答案 3 :(得分:0)

如您所见,onPostExecute()方法的返回类型为void。所以它不会返回任何东西。所以你可以使Bundle taskResult成为一个实例变量并在postExecute中用result初始化它