Как утилизировать одноразовые в RxJava2.0 - PullRequest
0 голосов
/ 29 января 2020

Я новичок в мире Rx, и я видел несколько примеров того, как избавиться от Disposable, но я не совсем понимаю разницу. Я использую Rx Java 2.0 (v2.2.17) и Rx Android (v2.1.1).

У меня вопрос, в чем разница между случаем 1 и случаем 2? Какой из этих двух случаев предпочтительнее в вашей заявке?

Дело 1:

private val compositeDisposable: CompositeDisposable = CompositeDisposable()

adsApiService.getVideos()
        .subscribeOn(Schedulers.io())
        .observeOn( AndroidSchedulers.mainThread())
        .subscribe(
            { v -> Log.d("video", v.toString()) },
            { e -> Log.d("video", e.toString()); compositeDisposable.dispose() },
            { compositeDisposable.dispose() },
            { disposable -> compositeDisposable.add(disposable)}
        )
}

Дело 2:

class MainActivity : AppCompatActivity() {

    private var compositeDisposable: CompositeDisposable? = CompositeDisposable()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        compositeDisposable?.add(api.getVideosAds())
    }

    override fun onDestroy(){
        super.onDestroy()
        compositeDisposable?.dispose()
    }

}

1 Ответ

1 голос
/ 29 января 2020

Лично? Ни того, ни другого.

Вы должны научиться использовать ViewModel s, оставить там свой CompositeDisposable и очистить его методом onCleared().

Кроме того, есть некоторые проблемы с вашими примерами:

Случай 1

Вы должны просто добавить одноразовые в compositeDisposable, не зная, почему вы передать 2 дополнительные лямбды на subscribe:

compositeDisposable += adsApiService.getVideos()
  .subscribeOn(Schedulers.io())
  .observeOn( AndroidSchedulers.mainThread())
  .subscribe(
    { v -> Log.d("video", v.toString()) },
    { e -> Log.d("video", e.toString()) }
  )

В этом случае вы на самом деле неправильно очищаете compositeDisposable, поскольку он не привязан ни к какому жизненному циклу (Activity, Fragment, или ViewModel)

Случай 2

Нет необходимости ставить вопросительный знак в утверждении:

private var compositeDisposable: CompositeDisposable? = CompositeDisposable()

Этот пример является семантически правильным, хотя api следует скрывать в ViewModel (архитектура MVVM) или Presenter (архитектура MVP) или в любой архитектуре. Знать все в классе (MainActivity) - ужасная практика, и ее очень сложно поддерживать.

...