Как реализовать операцию отмены на rx наблюдаемом? - PullRequest
0 голосов
/ 01 сентября 2018

Я давно выполняю операцию на сервере, и приложение должно показывать процент выполнения. Но у пользователя должна быть возможность остановить работу в любое время.

retrofit2 определение вызова сервера:

interface FooRemoteService {
    @POST("/foos")
    fun postFoos(@Body foos: List<FooPojo>): Observable<Response<List<String>>
 }

А аренда - это упрощенная версия, которую я понял.

  1. одноразовая переменная определена во фрагменте

    var disposable: Disposable? = null

  2. при нажатии кнопки запуска приложение начинает наблюдаться с итерации, отображает прогресс и присваивает значение одноразовой переменной:

    startButton.setOnClickListener {

    disposable = Observable.fromIterable(chunkedList)
            .flatMap { fooRemoteService.postFoos(it) }
            .subscribeOn(Schedulers.computation())
            .doOnDispose { Log.d("TAG", "end! due to dispose") }
            .subscribe(
                  { Log.d("TAG", "progress") }, 
                  { Log.e("TAG", it.message) }, 
                  { Log.d("TAG", "end!") }
             )
     }
    
  3. при нажатии кнопки отмены приложение пытается вызвать dispose () для любого объекта, на который ссылается одноразовая переменная:

    cancelButton.setOnClickListener { одноразовые? .dispose () Log.d ( "TAG", "распоряжаться!") }

Это работает, но у меня есть сомнения: это хороший подход? используя переменную, чтобы иметь доступ к операции, которая должна быть отменена? Является ли dispose () правильным методом для отмены в этом случае использования?

...