現在、非同期 http ライブラリを使用して、サーバーに対して http 要求を実行しています。ただし、これには、画面の回転中に http 呼び出しが進行中の場合、呼び出しが終了したときに古いコンテキストへの参照があるという問題があります。onCreateでキャプチャされた最新のインスタンスへの静的参照を保持し、その参照でメソッドを呼び出すことでこれを回避しました(そしてonDestroyでそれをnullにします)。それはうまくいきましたが、ハックのように見えました。以下のように、これに対処するためにフラグメントの使用を推奨する人もいます。
http://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html
これは良いアイデアのように思えますが、Activity で FragmentActivity を拡張し、私がやっていること専用の AsyncTaskLoader サブクラスを使用するだけでこれを達成できると考えていました。
ここに私の考えがあります: ApiRequest を受け取り、ApiResponse を返す AsyncTaskLoader を実装します。ただし、HttpAsyncTask をサブクラス化し、応答を解析するメソッドをオーバーライドして、応答を解析し、ApiResponse を拡張する別の種類のオブジェクトに変換できるようにしたいと考えています。ただし、これを実現するために型引数を指定する方法がわかりません。
これが私のコードです:
public class HttpAsyncTaskLoader</*not sure what to put here*/> extends AsyncTaskLoader<? not sure ?> {
private ApiClient mClient ;
private ApiRequest mRequest;
private volatile boolean isExecuting = false;
public HttpAsyncTaskLoader(Context context, ApiClient client, ApiRequest request) {
super(context);
mClient = client;
mRequest = request;
}
/**
* Subclasses should override this method to do additional parsing
* @param response
* @return
*/
protected /*subclass of ApiResponse (or ApiResponse itself)*/ onResponse(ApiResponse response)
{
//base implementation just returns the value, subclasses would
//do additional processing and turn it into some base class of ApiResponse
return response;
}
@Override
public /** not sure ***/ loadInBackground() {
HttpResponse response = null;
ResponseError error = null;
JSONObject responseJson = null;
ApiResponse apiResponse = null;
try {
isExecuting = true;
//synchronous call
response = mClient.execute(mRequest);
isExecuting = false;
responseJson = new JSONObject(EntityUtils.toString(response.getEntity()));
} catch (IOException e) {
error = new ResponseError(e);
} catch (URISyntaxException e) {
error = new ResponseError(e);
} catch (JSONException e) {
error = new ResponseError(e);
} finally {
mClient.getConnectionManager().closeExpiredConnections();
isExecuting = false;
apiResponse = new ApiResponse(getContext().getResources(), response, responseJson, error);
}
return onResponse(apiResponse);
}
@Override
public void onCanceled(ApiResponse response) {
if (isExecuting) {
mClient.getConnectionManager().shutdown();
}
}
}
どうすればこれを達成できるか考えている人はいますか?型パラメータの指定方法がわかりません。このクラスをそのまま使用できるようにし、サブクラス化できるようにしたいと考えています。ポイントは、上記の loadInBackground メソッドの機能を再実装したくないということです。ApiResponse をジェネリック パラメータとして使用し、onLoadFinished で返された ApiResponse オブジェクトを期待している特定の基本クラスにキャストできると確信していますが、よりタイプ セーフな方法でこれを行いたいと思います。また、本質的に同じことを別の方法で達成するアイデアにもオープンです。