RxJava2.0中disposable的处理方法

How to dispose of disposable in RxJava2.0

我是 Rx 世界的新手,我看过多个如何处理 Disposable 的例子,但我不太明白其中的区别。我正在使用 RxJava 2.0 (v2.2.17) 和 RxAndroid (v2.1.1)。

我的问题是情况 1 和情况 2 之间有什么区别?在您的申请中更喜欢这两种情况中的哪一种?

案例一:

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)}
        )
}

案例二:

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()
    }

}

个人?都没有。

你应该学习如何使用ViewModels,并保持你的CompositeDisposable在那里,并在onCleared()方法中清除它。

此外,您的示例存在一些问题:

案例一

您应该简单地将一次性添加到 compositeDisposable,不确定为什么要将 2 个额外的 lambda 传递给 subscribe

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

在这种情况下,您实际上没有正确清除 compositeDisposable,因为它没有附加到任何生命周期(ActivityFragmentViewModel

案例二

语句中不需要问号:

private var compositeDisposable: CompositeDisposable? = CompositeDisposable()

这个例子在语义上是正确的,尽管 api 应该隐藏在 ViewModel(MVVM 架构)或 Presenter(MVP 架构)或任何架构中。将所有内容都放在视图中 class (MainActivity) 是一种糟糕的做法,而且特别难以维护。