我对android编程很新。我已经编写了一个使用OkHttp库执行API查询的代码。
我的问题是,一旦OkHttp的排队过程开始,并且用户立即旋转手机,从而破坏并重新启动活动,这会导致第二次排队过程发生,从而导致代码执行2 OkHttp Api查询并行?
我知道如果我们将httpUrlConnections与AsyncTask(而不是OkHttp)一起使用,这是一个已知问题。我们可以通过使用AsyncTaskLoader绕过它,它与MainActivity具有不同的生命周期。但我只是想知道OkHttp也会考虑到这一点。
谢谢!如果这对我有帮助,我的代码示例如下所示。
private void performApiCall(String url) {
mLoadingPb.setVisibility(View.VISIBLE);
// is network available?
if (NetworkUtility.isNetworkAvailable(MainActivity.this)) {
// create new OkHttp client
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url(url).build(); // building the request
Call call = client.newCall(request);
// Asynchronous task
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
alertUserAboutError();
runOnUiThread(new Runnable() {
@Override
public void run() {
mLoadingPb.setVisibility(View.INVISIBLE);
}
});
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.d(TAG, "OkHttp, onResponse received");
// perform data download
if (response.isSuccessful()) {
runOnUiThread(new Runnable() {
@Override
public void run() {
mLoadingPb.setVisibility(View.INVISIBLE);
}
});
String jsonData = response.body().string(); // this is the raw data in json format
Log.v(TAG, jsonData);
try {
if (mMovieData == null) {
saveMovieData(jsonData);
runOnUiThread(new Runnable() {
@Override
public void run() {
mCurrentPage++;
setRecyclerView();
Log.d(TAG, "OkHttpCall completed");
}
});
} else {
appendMovieData(jsonData);
runOnUiThread(new Runnable() {
@Override
public void run() {
mCurrentPage++;
updateRecyclerView();
Log.d(TAG, "OkHttpCall completed");
}
});
}
} catch (JSONException e) {
e.printStackTrace();
Log.e(TAG, "Exception caught: ", e);
}
} else {
runOnUiThread(new Runnable() {
@Override
public void run() {
mLoadingPb.setVisibility(View.INVISIBLE);
}
});
alertUserAboutError();
}
}
});
} else {
runOnUiThread(new Runnable() {
@Override
public void run() {
mLoadingPb.setVisibility(View.INVISIBLE);
}
});
alertUserNetworkUnavailable();
}
}
答案 0 :(得分:2)
我的问题是,一旦OkHttp的入队过程开始,并且用户立即旋转手机,从而破坏并重新启动活动,这会导致第二次排队过程发生,从而导致代码执行2 OkHttp Api查询并行?
如果您的活动在创建时自动调用enqueue()
,则为是。
我们可以使用AsyncTaskLoader绕过它,它与MainActivity有一个独立的生命周期。
请注意,体系结构组件对视图模型和LiveData
的支持是Google目前解决加载器试图解决的问题的方向。