当前位置: 首页 > 面试题库 >

如何处理AsyncTask的返回值

申屠裕
2023-03-14
问题内容

我正在使用AsyncTask具有以下签名的类:

public class ApiAccess extends AsyncTask<List<NameValuePair>, Integer, String> {
    ...
private String POST(List<NameValuePair>[] nameValuePairs){
    ...
    return response;
}
}

protected String doInBackground(List<NameValuePair>... nameValuePairs) {
    return POST(params);
}

我正试图通过其他班级来称呼它:

ApiAccess apiObj = new ApiAccess (0, "/User");
// String signupResponse = apiObj.execute(nameValuePairs);
String serverResponse = apiObj.execute(nameValuePairs); //ERROR

但是在这里我得到这个错误:

Type mismatch: cannot convert from AsyncTask<List<NameValuePair>,Integer,String> to String

为什么String在Class扩展行中将我指定为第三个参数?


问题答案:

您可以通过对返回的AsyncTask调用AsyhncTask的get()方法来获得结果,但是当它等待获取结果时,它将把它从异步任务变成html" target="_blank">同步任务。

String serverResponse = apiObj.execute(nameValuePairs).get();

由于您的AsyncTask位于单独的类中,因此您可以创建一个接口类并在AsyncTask中对其进行声明,并以您希望从中访问结果的类中的委托形式实现新的接口类。此处提供了一个很好的指南:由于AsyncTask是一个单独的类,如何将OnPostExecute()的结果获取到主要活动中?。

我将尝试将以上链接应用于您的上下文。

(IApiAccessResponse)

public interface IApiAccessResponse {
    void postResult(String asyncresult);
}

(ApiAccess)

public class ApiAccess extends AsyncTask<List<NameValuePair>, Integer, String> {
...
    public IApiAccessResponse delegate=null;
    protected String doInBackground(List<NameValuePair>... nameValuePairs) {
        //do all your background manipulation and return a String response
        return response
    }

    @Override
    protected void onPostExecute(String result) {
        if(delegate!=null)
        {
            delegate.postResult(result);
        }
        else
        {
            Log.e("ApiAccess", "You have not assigned IApiAccessResponse delegate");
        }
    } 
}

(您的主类,实现IApiAccessResponse)

ApiAccess apiObj = new ApiAccess (0, "/User");
//Assign the AsyncTask's delegate to your class's context (this links your asynctask and this class together)
apiObj.delegate = this;
apiObj.execute(nameValuePairs); //ERROR

//this method has to be implement so that the results can be called to this class
void postResult(String asyncresult){
     //This method will get call as soon as your AsyncTask is complete. asyncresult will be your result.
}


 类似资料:
  • 问题内容: 我有一些EditText,用户可以输入ftp地址,用户名,密码,端口和testConnection按钮。如果成功建立连接,它将返回布尔值true。 我正在重新编写代码以使用AsyncTasks执行各种ftp操作,但是,如果连接成功,如何传递布尔值? 还有我的AsyncTask 问题答案: 如果myMethod从onPostExecute内部代码调用,它将在UI线程上运行。否则,你需要通

  • 为什么我的异步任务返回NULL?它以前工作得很好。我做错了什么? 这是我的代码。 日志类别08-22 09:51:04.279 113 59-11359/com.example.android.top10Music E/AndroidRuntime:致命异常:主进程:com.example.android.top10Music,PID:11359java.lang.nullPointerExcep

  • 特别是如果信号处理需要调用一个/一些活动,我如何实现? 我试图返回数据或异常,但它不起作用。 无法从信号方法返回数据。抛出异常将阻止工作流执行。

  • 问题内容: 一个简单的问题:是否可以返回in的值? 然后在我的: 编辑:这是很久以前我不熟悉Java的地方问的,现在我对它有了更好的了解,我将做一个简短的总结: 异步任务的要点是该任务为,这意味着调用该任务后,该任务将在其自己的线程上开始运行。从asynctask返回一个值将毫无意义,因为原始的调用线程已经进行了其他工作(因此该任务是异步的)。 考虑时间:在某个时间点,你启动了一个将与主线程并行运

  • 我正在简要研究SystemVABIforamd64/x86-64体系结构,并很好奇它如何处理超过128位的返回值,其中和还不够。 我在 Ubuntu 18.04 64 位(更一般地说,任何符合 amd64 POSIX 的系统)上编写了以下 C 代码: 将其编译为,并检查: 毫不奇怪,结构定义没有编译成任何指令,所以输出只包含函数。输出程序集看起来非常简单,从堆栈中为分配内存并分配初始值,然后返回它

  • 1.API 返回结构 返回结果(response)分为:状态码(status code)、头部(headers)、消息体(body)。其中算法的结果会以 JSON 格式放在消息体中。 如何从 HTTP 返回中分别获取这三部分信息,请参见所用 HTTP 库的文档。 解析 JSON 格式需要寻找所用语言的 JSON 库,参见 http://www.json.org/ 2.正常结果 状态码为 2xx的为