首页 > 解决方案 > Android 架构组件:如何取消改造请求?

问题描述

我已经在我的代码库中实现了结构(UI、ViewModel、Repo、Data Source)。当我想在 Retrofit 中取消请求时会带来一个问题。

我的约束是:

  1. 当用户取消请求时,我需要跟踪事件
  2. 当片段/活动被用户解除时(假设生命周期在 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
   }
}

标签: androidrx-javaretrofit2android-architecture-componentsandroid-livedata

解决方案


您可以取消改造请求。

使用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();
      }
  }

推荐阅读