Компонент архитектуры Android: как отменить запрос на модернизацию? - PullRequest
0 голосов
/ 28 июня 2018

Я реализовал структуру (пользовательский интерфейс, ViewModel, Repo, источник данных) в моей базе кода. И возникает проблема, когда я хочу отменить запрос в 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();
    }

}

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 голосов
/ 28 июня 2018

Вы можете отменить запрос на модернизацию.

Используйте 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();
      }
  }
0 голосов
/ 28 июня 2018

Позвоните dispose() на одноразовый объект, который вы получаете в методе onSubscribe.

downloadSubscription.dispose();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...