В настоящее время я использую асинхронную http-библиотеку для выполнения HTTP-запросов на нашем сервере. Однако это связано с тем, что, если во время вращения экрана выполняется HTTP-вызов, мы будем иметь ссылку на старый контекст, когда вызов завершится. Я как бы обошел это, сохраняя статическую ссылку на последний экземпляр, захваченный в onCreate, и будет вызывать методы с этой ссылкой (и обнулить его в onDestroy). Он работал нормально, но выглядел как хак. Я видел, как некоторые люди рекомендуют использовать фрагменты, чтобы справиться с этим, например:
http://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html
которые кажутся хорошими идеями, но я думал, что смогу это сделать, просто включив функцию Activity FragmentActivity и используя подкласс AsyncTaskLoader, который специально предназначен для того, что я делаю.
Вот моя идея: Внедрение AsyncTaskLoader с использованием ApiRequest и возвращает ApiResponse. Однако я хочу иметь возможность подкласса 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 в качестве моего общего параметра, а затем применить объекты ApiResponse, возвращенные в onLoadFinished, к определенному базовому классу, который я ожидаю, но я предпочел бы сделать это более безопасным типом. Также я открыт для идей, которые выполняют по существу одно и то же, но по-другому.