私はRESTサービスで動作するいくつかの小さなAndroidアプリケーションを書いています。応答の基本構造は次のとおりです。{結果: "ok / error"、メッセージ: "some string"、エンティティ:"オブジェクトまたはエラーの説明"}
エンティティタイプは、応答が正常かエラーかによって毎回異なります。ここで、AsyncTaskからサービスを呼び出しており、結果をUIスレッドに返す必要があります。
サーバーからJSONをdesirializeするためにgsonライブラリを使用しています。問題は、自分が受けた応答のタイプ(OKまたはエラー)を知ることができないことです。
また、AsyncTaskは単一のタイプのみをUIスレッドに返すことができます。以下は私が思いついたものの例です。私はJavaプログラマーではないことを述べる必要があります。すべてのパターンを知っているとは限らず、何かが恋しいかもしれません。
とにかく、私はどんな助けでもうれしいです。
public class RegisterProxyAsync extends AsyncTask<User, String, Object> {
@Override
protected Object doInBackground(User... params) {
try {
Gson gson = new Gson();
String request = gson.toJson(params[0]);
HttpClient client = new DefaultHttpClient();
HttpPost postAction = new HttpPost("http://SomeServiceEndpoint/register");
postAction.addHeader(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
postAction.setEntity(new StringEntity(request));
HttpResponse response = client.execute(postAction);
if (response != null) {
InputStream stream = response.getEntity().getContent();
String strResult = CharStreams.toString(new InputStreamReader(stream));
try {
UserResponse userResponse = gson.fromJson(strResult, UserResponse.class);
return userResponse;
} catch (Exception e) {
ErrorResponse errorResponse = gson.fromJson(strResult, ErrorResponse.class);
return errorResponse;
}
Log.e("debug", strResult);
}
} catch (Exception e) {
// TODO:Handle exception
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Object result) {
// TODO: execute some work
}
}
編集:適切なHttpCodes(成功の場合は200、エラーの場合は400)を返すようにサーバーを変更しましたが、doinbackgroundメソッドから2つの異なるタイプのオブジェクトを返すという問題があります。1つはエラー用、もう1つは成功用です。