一个AsyncTask用于多个活动

时间:2012-11-11 11:00:55

标签: android android-asynctask

我正在编写一个使用WebServices来检索数据的应用程序。最初,我为每个需要WebService数据的活动提供了一个私有AsyncTask类。但我决定通过创建AsyncTask作为公共类来使代码更简单。一切正常,但我的问题是当我想从AsyncTask访问检索到的数据时。

例如,这是我的AsyncTask课程。

public class RestServiceTask extends AsyncTask<RestRequest, Integer, Integer> {

    /** progress dialog to show user that the backup is processing. */
    private ProgressDialog dialog;
    private RestResponse response;
    private Context context;

    public RestServiceTask(Context context) {
        this.context = context;

        //...Show Dialog
    }

    protected Integer doInBackground(RestRequest... requests) {
        int status = RestServiceCaller.RET_SUCCESS;
        try {
            response = new RestServiceCaller().execute(requests[0]);
        } catch(Exception e) {
            //TODO comprobar tipo error
            status = RestServiceCaller.RET_ERR_WEBSERVICE;
            e.printStackTrace();
        }

        return status;
    }

    protected void onPreExecute() {
        response = null;
    }

    protected void onPostExecute(Integer result) {

        if (dialog.isShowing()) {
            dialog.dismiss();
        }

        switch (result) {
        case RestServiceCaller.RET_ERR_NETWORK:
            Toast.makeText(
                    context,
                    context.getResources().getString(
                            R.string.msg_error_network_unavailable),
                    Toast.LENGTH_LONG).show();
            break;
        case RestServiceCaller.RET_ERR_WEBSERVICE:
            Toast.makeText(
                    context,
                    context.getResources().getString(
                            R.string.msg_error_webservice), Toast.LENGTH_LONG)
                    .show();
            break;
        default:
            break;
        }
    }

    public RestResponse getResponse() throws InterruptedException {
        return response;
    }
}

RestServiceCallerRestRequestRestResponse是我创造的clasess。 我正在使用这样的任务:

RestRequest request = new JSONRestRequest();
request.setMethod(RestRequest.GET_METHOD);
request.setURL(Global.WS_USER);
HashMap<String, Object> content = new HashMap<String, Object>() {
   {
      put(Global.KEY_USERNAME, username.getText().toString());
   }
};
request.setContent(content);
RestServiceTask task = new RestServiceTask(context);
task.execute(request);

此代码工作正常并正确调用Web服务,我的问题是当我想要访问响应时。在AsyncTask我创建了方法getResponse,但是当我使用它时,它返回一个空对象,因为AsyncTask仍在进行中,因此此代码不起作用:< / p>

//....
task.execute(request);
RestResponse r = new RestResponse();
r = task.getResponse();

r将是空指针,因为AsyncTask仍在下载数据。

我尝试在getResponse函数中使用此代码,但它不起作用:

public RestResponse getResponse() throws InterruptedException {
        while (getStatus() != AsyncTask.Status.FINISHED);
        return response;
    }

我认为使用while循环,线程将等到AsyncTask完成,但我所获得的是无限循环。

所以我的问题是,我怎么能等到AsyncTask完成,所以getResponse方法会返回正确的结果?

最好的解决方案是使用onPostExecute方法,但由于许多活动使用AsyncTask,我不知道该怎么做。

1 个答案:

答案 0 :(得分:4)

尝试创建回调接口。这个异步任务问题Common class for AsyncTask in Android?的答案给出了一个很好的解释。