android - 第一次执行后如何停止排队的调用?
问题描述
我对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 秒,您调用call.cancel()
并且请求正在停止。
推荐阅读
- collections - 删除 ATL ATLAS 转换语言中每个集合的重复项
- arduino - 由 ESP32 (Arduino) 控制的电机驱动
- apache-kafka - 将 confluent.cloud(Kafka) 中的工作转换为弹性云
- c# - 通用 Blazor 组件的编译器错误
- mysql - 按日期列的功能分组时查询慢
- java - ContentManagerServiceImpl 中构造函数的参数 0 需要一个无法找到的 PropertyFacade' 类型的 bean
- javascript - 在 contentEditable 中插入复杂的 React 组件?
- arrays - 将 tf.cond 与比较两个张量的条件一起使用
- java - 通过获取用户的输入,在 Java 中将时间格式化为 24 小时
- spring - 使用 vaadin 在异步方法中调用 restController