我对android开发很新。尝试连接某个站点并从中获取数据。我只在主活动中从onCreate调用此函数。每当我向左或向右转动虚拟Android手机时,我会在EditText中看到新的“run()”字符串,并在Wireshark中看到请求。如何正确阻止?
在OnResponse中尝试了call.cancel()和mClient.dispatcher()。cancelAll()
protected void Load(String url) {
Request request = new Request.Builder()
.url(url)
.build();
mClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
}
@Override
public void onResponse(Call call, final Response response) throws IOException {
if (response.isSuccessful()) {
mHandler.post(new Runnable() {
@Override
public void run() {
mEdit.setText(mEdit.getText() + "run()\n");
}
});
}
}
});
}
改造支持排队取消,它很有效。我想如果您尝试运行此代码 - 您的客户端队列将被停止
protected void Load(String url) {
Request request = new Request.Builder()
.url(url)
.build();
Call<Response> mCall = mClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
if (call.isCanceled()) {
Log.e(TAG, "request was cancelled");
}
else {
Log.e(TAG, "other larger issue, i.e. no network connection?");
}
}
@Override
public void onResponse(Call call, final Response response) throws IOException {
if (response.isSuccessful()) {
mHandler.post(new Runnable() {
@Override
public void run() {
mEdit.setText(mEdit.getText() + "run()\n");
}
});
}
}
});
mCall.cancel();
}
我不知道你的项目结构和你使用的是什么样的模式(MVP,MVVM或其他),但简单来说,这个代码可以通过返回Call来改进
protected void Load(String url): Call<Response>
然后您可以处理您的请求状态,例如,如果超过5秒,则调用qazxsw poi并且请求正在停止。
每次配置更改时都会调用onCreate(例如,您可以旋转手机/模拟器)。欲了解更多信息:call.cancel()
您可以保存响应以防止每个onCreate上的新请求。像这样的东西:
https://developer.android.com/guide/components/activities/activity-lifecycle
并在您的onResponse中保存响应:
MainActivity {
private Response savedResponse;
onCreate() {
if (savedResponse == null) {
Load(url)
}
}
}
但是,正确的方法是将网络调用/请求与活动生命周期分开,并在其他位置加载数据(Service,WorkManager,...)