Android 将AsyncTask的结果返回到其实例化变量
我已经构建了一个完全工作的异步任务来处理设备授权,但唯一的问题是,我很难将生成的Bundle返回到其实例化变量,以便在主活动中继续处理。以下是AsyncTask实例化:Android 将AsyncTask的结果返回到其实例化变量,android,android-asynctask,Android,Android Asynctask,我已经构建了一个完全工作的异步任务来处理设备授权,但唯一的问题是,我很难将生成的Bundle返回到其实例化变量,以便在主活动中继续处理。以下是AsyncTask实例化: Bundle taskResult = new AuthorizeDevice(this).execute(passToAuthroization).get(); 我已经阅读了一些关于这个主题的文献,发现onPostExecute方法可能与此有关,因此考虑到这一点,这里是: protected void onPostExecu
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();
}
那么,如何将该捆绑包返回到主活动?AsyncTask是一个非阻塞调用,您无法以您想要的方式获取捆绑包。然而,您可以做的是在AsyncTask中创建一个接口,它将告诉您何时完成。类似于onTaskComplete的东西,您可以将生成的包传递到那里。AsyncTask是一个非阻塞调用,您无法以您想要的方式获取包。然而,您可以做的是在AsyncTask中创建一个接口,它将告诉您何时完成。类似于onTaskComplete的东西,您可以将生成的bundle传递到那里。正如您可以看到的,onPostExecute方法的返回类型是void。所以它不会返回任何东西。因此,您可能可以将Bundle taskResult设置为实例变量,并在postExecute中使用result对其进行初始化,因为您可以看到onPostExecute方法的返回类型为void。所以它不会返回任何东西。因此,您可能可以将Bundle taskResult作为一个实例变量,并在postExecute中使用result初始化它
public interface AuthorisationCallback() {
void onFinish(Bundle bun);
};
实现这个接口,并对bundle执行任何您想要的操作
AuthorisationCallback mAuthcallback = new AuthorisationCallback() {
void onFinish(Bundle bun) {
// Do what ever with the bundle.
}
};
将其实现引用发送到AsyncTask
new AuthorizeDevice(mAuthcallback).execute(passToAuthroization);
在onpost中执行do
protected void onPostExecute(Bundle result){
dialog.dismiss();
mCallback.onFinish(result);
}
将回调接口定义为
public interface AuthorisationCallback() {
void onFinish(Bundle bun);
};
实现这个接口,并对bundle执行任何您想要的操作
AuthorisationCallback mAuthcallback = new AuthorisationCallback() {
void onFinish(Bundle bun) {
// Do what ever with the bundle.
}
};
将其实现引用发送到AsyncTask
new AuthorizeDevice(mAuthcallback).execute(passToAuthroization);
在onpost中执行do
protected void onPostExecute(Bundle result){
dialog.dismiss();
mCallback.onFinish(result);
}
首先,仔细看看API 我需要更多地查看您的代码才能知道您正在尝试做什么,但PravinCG是正确的,您使用AsyncTask.executecall的方式是不正确的。如果需要返回值,请从onPostExecute获取它 看起来您已经开始将AsyncTask子类化了,如果您需要访问您的活动,您能不能不将AsyncTask子类简单地放在您的活动类中?这将允许您从onPostExecute中访问活动的方法,按照设计,onPostExecute是在UI线程上进行的。同样,我们需要看到更多的代码来知道这是多么可行,只是把它放在那里。
如果没有,只需将对活动的引用传递到AsyncTask子类中,并使用公共方法从onPostExecute返回捆绑包,或者使用建议的接口…首先,仔细查看API 我需要更多地查看您的代码才能知道您正在尝试做什么,但PravinCG是正确的,您使用AsyncTask.executecall的方式是不正确的。如果需要返回值,请从onPostExecute获取它 看起来您已经开始将AsyncTask子类化了,如果您需要访问您的活动,您能不能不将AsyncTask子类简单地放在您的活动类中?这将允许您从onPostExecute中访问活动的方法,按照设计,onPostExecute是在UI线程上进行的。同样,我们需要看到更多的代码来知道这是多么可行,只是把它放在那里。
如果没有,只需将对活动的引用传递到AsyncTask子类中,并使用公共方法从onPostExecute返回捆绑包,或者使用建议的接口…为什么捆绑包。我不确定。一件事是,如果您在doInBackground中遇到异常,那么在onPostExecutewell中会得到一个空值。toasts尝试访问UDID只是为了调试。我已经制定了一种预定义的方法,可以捕获异常并通过包发送,这样我就可以将问题通知用户。请查看PravinCG的答案。他是对的。您必须想出一个等待机制,或者以某种方式从onPostExecute抛出捆绑包。我不确定。一件事是,如果您在doInBackground中遇到异常,那么在onPostExecutewell中会得到一个空值。toasts尝试访问UDID只是为了调试。我已经制定了一种预定义的方法,可以捕获异常并通过包发送,这样我就可以将问题通知用户。请查看PravinCG的答案。他是对的。你必须想出一个等待机制,或者从onPostExecute抛出包。+1我错过了实例化部分。是,异步任务是非阻塞的。+1我错过了实例化部分。是的,AsyncTask是非阻塞的。好的,但是我如何从onFinish重定向到另一个活动,我不能传递上下文或启动intentok,但是我如何从onFinish重定向到另一个活动,我不能传递上下文或启动intent