我已经在代码库中实现了结构(UI,ViewModel,Repo,数据源)。当我想在翻新中取消请求时,就会出现问题。
我的约束是:
在这种结构下(使用NetworkBoundResource也没有取消请求的控制权),如何在改装中取消我的请求?
感谢任何评论或答案,或者如果有更好的解决方案来解决此问题,我会尝试一下。
MyViewModel.java
public class MyViewModel extends ViewModel {
private Repo repo;
MyViewModel(Repo repo) {
this.repo = repo;
}
public void cancelAllRequest(){
repo.cancelAllRequest();
}
}
Repo.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
}
}
答案 0 :(得分:1)
您可以取消改装请求。
使用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();
}
}
答案 1 :(得分:0)
对通过onSubscribe方法获得的一次性对象调用dispose()
。
downloadSubscription.dispose();