android - Android 架构组件:如何取消改造请求?
问题描述
我已经在我的代码库中实现了结构(UI、ViewModel、Repo、Data Source)。当我想在 Retrofit 中取消请求时会带来一个问题。
我的约束是:
- 当用户取消请求时,我需要跟踪事件
- 当片段/活动被用户解除时(假设生命周期在 onDestroy 中),它将被视为取消操作。
在这种结构下(使用 NetworkBoundResource 也无法控制取消请求),我如何在改造中取消我的请求?
感谢任何评论或答案,或者如果有更好的实现来解决这个问题,我会试一试。
MyViewModel.java
public class MyViewModel extends ViewModel {
private Repo repo;
MyViewModel(Repo repo) {
this.repo = repo;
}
public void cancelAllRequest(){
repo.cancelAllRequest();
}
}
回购.java
public class Repo{
private APIService apiService;
public LiveData<File> getFile(int id){
//Retrofit
MutableLiveData<File> data = new MutableLiveData<>():
Observable<User> observable= apiService.getFile(id);
observable.subscribeOn(scheduler)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(subscriber);
return data;
}
public LiveData<File> postFile(File file){
//Retrofit
MutableLiveData<File> data = new MutableLiveData<>():
Observable<User> observable= apiService.postFile();
observable.subscribeOn(scheduler)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(subscriber);
return data;
}
public void cancelAllRequest(){
//how to get the subscription and unsubscribe it
}
}
解决方案
您可以取消改造请求。
使用cancel()方法取消请求。
isCanceled ()将帮助您确定请求是否已取消。
callWithCancel = apiService.getDataFromDynamicUrl(url);
callWithCancel.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
if (response.isSuccessful()) {
Toast.makeText(getActivity(), "Request Successful", Toast.LENGTH_SHORT).show();
} else {
Timber.i("Request unsuccessful" + response.errorBody().toString());
Toast.makeText(getActivity(), "Request Unsuccessful", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
if (call.isCanceled()) {
}else {
Toast.makeText(getActivity(), "Request Failed", Toast.LENGTH_SHORT).show();
}
}
});
取消
if (callWithCancel != null){
callWithCancel.cancel();
}
您可以为所有请求维护一个列表或队列。将每个请求添加到队列中。当任何请求成功时,从列表或队列中删除该请求。因此,您的列表和队列将始终包含待处理的请求。因此,您可以在需要时轻松取消所有请求。
public void cancelAllRequest(){
//how to get the subscription and unsubscribe it
while(!isEmpty()){
requestQueue.remove();
}
}
推荐阅读
- javascript - 如何在Javascript中验证特定格式的日期
- java - Java双除法正数
- visual-studio - Visual Studio IDE - 多命令的键绑定
- javascript - 发出 axios 获取请求并使用 React useState 但是在记录数据时它仍然显示 null
- wireguard - 在我从服务器内部 ping 另一台服务器之前,无法通过 SSH 连接到wireguard IP
- java - Mybatis JsonTypeHandler中如何使用泛型?
- git - 为什么我无法克隆我作为合作者的私有存储库
- c# - 会话在 ASP.Net Core Web API 中不起作用
- php - 在 PHP 中将 JSON 数组嵌套到 csv
- pine-script - Pine-Script:看似相同的值提供不同的结果