Сегодня я обновился до Android Studio 3.1, который, кажется, добавил еще несколько проверок на ворсинок. Одна из этих проверок линта предназначена для однократных subscribe()
вызовов RxJava2 , которые не хранятся в переменной. Например, получение списка всех игроков из базы данных моей комнаты:
Single.just(db)
.subscribeOn(Schedulers.io())
.subscribe(db -> db.playerDao().getAll());
В результате появится большой желтый блок и всплывающая подсказка:
Результат
subscribe
не используется
Какова наилучшая практика для таких однократных вызовов Rx? Должен ли я придерживаться Disposable
и dispose()
по полной? Или мне просто нужно @SuppressLint
двигаться дальше?
Кажется, это влияет только на RxJava2 ( io.reactivex
), RxJava ( rx
) не имеет этого линта.
android
android-studio
rx-java2
lint
android-studio-3.1
Майкл Додд
источник
источник
Disposable
область действия члена и вызываю ее,dispose()
когда сингл завершается, но это кажется излишне громоздким. Мне интересно узнать, есть ли способы сделать это лучше.Ответы:
IDE не знает, какие потенциальные последствия может иметь ваша подписка, если она не удалена, поэтому она рассматривает ее как потенциально опасную. Например, ваш
Single
может содержать сетевой вызов, который может вызвать утечку памяти, если васActivity
бросят во время его выполнения.Удобный способ управлять большим количеством
Disposable
s - использовать CompositeDisposable ; просто создайте новуюCompositeDisposable
переменную экземпляра в вашем включающем классе, затем добавьте все свои Disposables в CompositeDisposable (с RxKotlin вы можете просто добавитьaddTo(compositeDisposable)
ко всем своим Disposable). Наконец, когда вы закончите со своим экземпляром, позвонитеcompositeDisposable.dispose()
.Это избавит от предупреждений о ворсинках и обеспечит
Disposables
правильное управление.В этом случае код будет выглядеть так:
источник
error: cannot find symbol method addTo(CompositeDisposable)
с "rxjava: 2.1.13". Откуда этот метод? (RxSwift или RxKotlin, я полагаю)В тот момент, когда Activity будет уничтожен, список Disposables очищается, и все в порядке.
источник
Вы можете подписаться с DisposableSingleObserver :
В случае, если вам нужно напрямую удалить
Single
объект (например, до того, как он испускается), вы можете реализовать методonSubscribe(Disposable d)
для получения и использованияDisposable
ссылки.Вы также можете реализовать
SingleObserver
интерфейс самостоятельно или использовать другие дочерние классы.источник
Как было предложено, вы можете использовать некоторые глобальные данные,
CompositeDisposable
чтобы добавить туда результат операции подписки.Библиотека RxJava2Extensions содержит полезные методы для автоматического удаления созданного одноразового использования из файла
CompositeDisposable
после его завершения. См. Раздел subscribeAutoDispose .В вашем случае это может выглядеть так
источник
Вы можете использовать Uber AutoDispose и rxjava
.as
Убедитесь, что вы понимаете, когда отказываетесь от подписки на основе ScopeProvider.
источник
Снова и снова я возвращаюсь к вопросу о том, как правильно распоряжаться подписками и, в частности, с этой публикацией. В нескольких блогах и в беседах утверждается, что отказ от вызова
dispose
обязательно ведет к утечке памяти, что, на мой взгляд, является слишком общим утверждением. Насколько я понимаю, предупреждение оsubscribe
несохранении результата не является проблемой в некоторых случаях, потому что:Поскольку я не хочу подавлять предупреждения о ворсинах, я недавно начал использовать следующий шаблон для случаев с синхронным наблюдаемым:
Мне были бы интересны любые комментарии по этому поводу, независимо от того, является ли это подтверждением правильности или обнаружением лазейки.
источник
Доступен еще один способ, который позволяет избежать использования Disposables вручную (добавлять и удалять подписки).
Вы можете определить Observable, и этот Observable будет получать контент от SubjectBehaviour (если вы используете RxJava). И если передать это наблюдаемое в LiveData , это должно сработать. Посмотрите следующий пример, основанный на первоначальном вопросе:
источник
Если вы уверены, что одноразовые предметы обрабатываются правильно, например, используя оператор doOnSubscribe (), вы можете добавить это в Gradle:
источник
@SuppressLint("CheckResult")
только метода.