目前我正在使用异步 http 库对我们的服务器执行 http 请求。然而,这带来了一个问题,如果在屏幕旋转期间正在进行 http 调用,我们将在调用完成时引用旧上下文。我通过保持对 onCreate 中捕获的最新实例的静态引用来解决这个问题,并使用该引用调用方法(并在 onDestroy 中将其设为空)。它工作正常,但看起来像一个黑客。我见过有人推荐使用片段来处理这个问题,比如这里:
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 对象转换为我期望的特定基类,但我宁愿以更类型安全的方式执行此操作。此外,我对完成基本相同但以另一种方式完成的想法持开放态度。