Nano Hash - криптовалюты, майнинг, программирование

Как правильно очистить/утилизировать Disposable, который периодически выполняет Completable?

У меня есть одноразовый, который через какой-то промежуток времени выполняет запрос к API

   val disposable =
    Flowable.interval(0, UPDATE_INTERVAL, TimeUnit.MILLISECONDS)
        .map {
          someRepository.sync(id)
              .doOnSubscribe { disposables?.add(it) }
              .subscribe()
        }
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .doOnError { Timber.e(it, "Unable to sync") }
        .subscribe()
disposables?.add(disposable)

Я пытаюсь очистить его внутри метода onBackPressed:

override fun onBackPressed() {
  super.onBackPressed()
  disposables?.dispose()
}

Однако это не очищается, и я вижу в Android Studio Profiler, что он все еще выполняет этот Flowable после того, как я нажал кнопку «Назад».

Что я делаю неправильно?

ОБНОВИТЬ:

Когда я меняю оператора карты на flatMap, как предложил akarnokd:

Error:(160, 11) Type inference failed: fun <R : Any!> flatMap(p0: 
((Long) -> Publisher<out R!>!)!, p1: Int): Flowable<R!>!
cannot be applied to
((Long) -> Completable,Int)
20.04.2018

Ответы:


1

Прежде всего, вы подписываетесь на обработчик вместо использования flatMap/concatMap:

val disposable =
Flowable.interval(0, UPDATE_INTERVAL, TimeUnit.MILLISECONDS, Schedulers.io())
    .onBackpressureDrop()
    .flatMapCompletable ({ someRepository.sync(id) }, 1)
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe({ }, { Timber.e(it, "Unable to sync") })

disposables.add(disposable)

override fun onBackPressed() {
    super.onBackPressed()
    disposables.clear()
}

2) можно указать ветку interval. 3) .subscribeOn(Schedulers.io()) не имеет никакого эффекта, так как interval излучает в своем собственном потоке. 4) doOnError - это не обработка ошибок, а только просмотр ошибок. Ошибка все равно приведет к сбою вашего потока/приложения. 5) disposables.clear() обычно является лучшим вызовом для очистки запущенных потоков, чтобы вы могли повторно использовать тот же disposables в следующий раз.

Я вижу в Android Studio Profiler, что он все еще работает

Несмотря на неловкость, ваша первоначальная установка должна была остановиться на dispose(). Мое лучшее предположение состоит в том, что disposables?.add не выполняется, потому что disposables в какой-то момент имеет или становится нулевым.

20.04.2018
  • Сначала я пробовал flatMap, но я получал ошибку inrefence типа на flatMap (также и в вашем коде): 20.04.2018
  • Используйте 1_. 20.04.2018
  • Спасибо, после вашего предложения это работает, однако IDE заставила меня удалить второй параметр из метода flatMapCompletable. 20.04.2018
  • Я не знаю Kotlin, поэтому я не знаю, как совместить лямбду функционального интерфейса Java и параметр. Предполагалось, что этот параметр предотвратит перекрытие вашего вызова sync, если он занимает больше времени, чем интервал времени. 20.04.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..