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()
}
}
个人?都没有。
你应该学习如何使用ViewModel
s,并保持你的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
,因为它没有附加到任何生命周期(Activity
、Fragment
或 ViewModel
)
案例二
语句中不需要问号:
private var compositeDisposable: CompositeDisposable? = CompositeDisposable()
这个例子在语义上是正确的,尽管 api
应该隐藏在 ViewModel
(MVVM 架构)或 Presenter
(MVP 架构)或任何架构中。将所有内容都放在视图中 class (MainActivity
) 是一种糟糕的做法,而且特别难以维护。
我是 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()
}
}
个人?都没有。
你应该学习如何使用ViewModel
s,并保持你的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
,因为它没有附加到任何生命周期(Activity
、Fragment
或 ViewModel
)
案例二
语句中不需要问号:
private var compositeDisposable: CompositeDisposable? = CompositeDisposable()
这个例子在语义上是正确的,尽管 api
应该隐藏在 ViewModel
(MVVM 架构)或 Presenter
(MVP 架构)或任何架构中。将所有内容都放在视图中 class (MainActivity
) 是一种糟糕的做法,而且特别难以维护。