Я давно выполняю операцию на сервере, и приложение должно показывать процент выполнения. Но у пользователя должна быть возможность остановить работу в любое время.
retrofit2 определение вызова сервера:
interface FooRemoteService {
@POST("/foos")
fun postFoos(@Body foos: List<FooPojo>): Observable<Response<List<String>>
}
А аренда - это упрощенная версия, которую я понял.
одноразовая переменная определена во фрагменте
var disposable: Disposable? = null
при нажатии кнопки запуска приложение начинает наблюдаться с итерации, отображает прогресс и присваивает значение одноразовой переменной:
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!") }
)
}
при нажатии кнопки отмены приложение пытается вызвать dispose () для любого объекта, на который ссылается одноразовая переменная:
cancelButton.setOnClickListener {
одноразовые? .dispose ()
Log.d ( "TAG", "распоряжаться!")
}
Это работает, но у меня есть сомнения: это хороший подход? используя переменную, чтобы иметь доступ к операции, которая должна быть отменена? Является ли dispose () правильным методом для отмены в этом случае использования?