Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 将AsyncTask的结果返回到其实例化变量_Android_Android Asynctask - Fatal编程技术网

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

Android 将AsyncTask的结果返回到其实例化变量,android,android-asynctask,Android,Android Asynctask,我已经构建了一个完全工作的异步任务来处理设备授权,但唯一的问题是,我很难将生成的Bundle返回到其实例化变量,以便在主活动中继续处理。以下是AsyncTask实例化: Bundle taskResult = new AuthorizeDevice(this).execute(passToAuthroization).get(); 我已经阅读了一些关于这个主题的文献,发现onPostExecute方法可能与此有关,因此考虑到这一点,这里是: protected void onPostExecu

我已经构建了一个完全工作的异步任务来处理设备授权,但唯一的问题是,我很难将生成的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();
}

那么,如何将该捆绑包返回到主活动?

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