我对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");
}
});
}
}
});
}
答案 0 :(得分:0)
retrofit支持取消入队,并且效果很好。 而且我认为,如果您尝试运行此代码-您的客户端入队将会停止
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秒,则您致电call.cancel()
,请求将停止。
答案 1 :(得分:0)
onCreate。有关更多信息:https://developer.android.com/guide/components/activities/activity-lifecycle
您可以保存响应,以防止在每个onCreate上发出新请求。像这样:
MainActivity {
private Response savedResponse;
onCreate() {
if (savedResponse == null) {
Load(url)
}
}
}
,然后在您的onResponse中保存响应:
@Override
public void onResponse(Call call, final Response response) throws IOException {
if (response.isSuccessful()) {
savedResponse = response; // <----
mHandler.post(new Runnable() {
@Override
public void run() {
mEdit.setText(mEdit.getText() + "run()\n");
}
});
}
}
但是,正确的方法是将网络调用/请求与活动生命周期分开,并将数据加载到其他位置(服务,WorkManager等)