Android体系结构组件:如何取消改装请求?

时间:2018-06-28 06:59:09

标签: android rx-java retrofit2 android-architecture-components android-livedata

我已经在代码库中实现了结构(UI,ViewModel,Repo,数据源)。当我想在翻新中取消请求时,就会出现问题。

我的约束是:

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

}

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
   }
}

2 个答案:

答案 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();