我已经构建了一个完全工作的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();
}
那么如何将该捆绑包带回主要活动?
答案 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
初始化它