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;
}
}
RestServiceCaller
、RestRequest
および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();
r
AsyncTask
はまだデータをダウンロードしているため、nullポインタになります。
関数でこのコードを使用しようとしましたが、getResponse
機能しません。
public RestResponse getResponse() throws InterruptedException {
while (getStatus() != AsyncTask.Status.FINISHED);
return response;
}
whileループでは、スレッドはAsyncTask
終了するまで待つと思いましたが、私が達成したのは無限ループでした。
だから私の質問は、メソッドが正しい結果を返すAsyncTask
ように、終了するまでどのように待つことができるかということです。getResponse
最善の解決策はこのonPostExecute
方法を使用することAsyncTask
ですが、多くのアクティビティで使用されているため、何をすべきかわかりません。