3

WebServicesを使用してデータを取得するアプリを作成しています。最初はAsyncTask、WebServiceからのデータを必要とするアクティビティごとにプライベートクラスがありました。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;
    }
}

RestServiceCallerRestRequestおよびRestResponse私が作成したクラスです。私は次のようなタスクを使用しています:

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、それを使用すると、がまだ進行中であるためnullオブジェクトが返されるため、AsyncTaskこのコードは機能しません。

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

rAsyncTaskはまだデータをダウンロードしているため、nullポインタになります。

関数でこのコードを使用しようとしましたが、getResponse機能しません。

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

whileループでは、スレッドはAsyncTask終了するまで待つと思いましたが、私が達成したのは無限ループでした。

だから私の質問は、メソッドが正しい結果を返すAsyncTaskように、終了するまでどのように待つことができるかということです。getResponse

最善の解決策はこのonPostExecute方法を使用することAsyncTaskですが、多くのアクティビティで使用されているため、何をすべきかわかりません。

4

1 に答える 1

4

コールバックインターフェースを作成してみてください。この非同期タスクの質問に対する答えAndroidのAsyncTaskの共通クラス?それについての良い説明を与えます。

于 2012-11-11T11:15:32.507 に答える