【问题标题】:How to dispose of disposable in RxJava2.0RxJava2.0中如何处理disposable
【发布时间】:2020-01-29 13:07:02
【问题描述】:

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

我的问题是 case 1 和 case 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()
    }

}

【问题讨论】:

  • 我不知道为什么在示例 2 中您在 onPause 中清除了一次性用品
  • 如果你正在学习并开始在你的项目中引入 RxJava/RxAndroid。我会建议你改用/学习 kotlin 协程。
  • @xinaiz 确实是可选的。我会编辑它,这样它就不会那么混乱了。 - 我只看到了一点协程,我不知道从哪里开始,而且它似乎实现起来更长。我选择了 RxJava,因为它以后对我的项目很有用

标签: kotlin rx-java2 rx-android


【解决方案1】:

个人?两者都没有。

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

另外,你的例子也有一些问题:

案例 1

你应该简单地将一次性添加到compositeDisposable,不知道为什么你将额外的 2 个 lambdas 传递给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

案例 2

语句中不需要问号:

private var compositeDisposable: CompositeDisposable? = CompositeDisposable()

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

【讨论】:

  • Case1: subcribe 可以接受 4 个参数,onNext,onError,onComplete,onSubscribe 我看不出不使用它们的意义,因为它们是可用的。案例2:问号是错字。我目前一个人在一个大项目中,在 MVVM 方面没有真正的经验,我知道一些 MVP,但不足以正确实现它。我不打算将所有内容都放在 MainActivity 中,api 设置为 by lazy 我只是没有显示它,因为它与案例无关。
  • 好的,我了解onSubscribe 的用法。但是onComplete 的使用并没有做任何有用的事情,流程已经完成,所以没有什么可处理的。
  • 没错,我在github 上读到了一个问题,(another ref) 有点太快了,尽管我不得不自己去dispose。所以第一种情况是没用的,因为它已经是后台发生的事情了,我不需要再写了。
猜你喜欢
  • 2018-09-11
  • 1970-01-01
  • 2018-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-05
相关资源
最近更新 更多