Kotlin 如何在RxJava2.0中处置一次性垃圾
我是Rx world的新手,我见过多个如何处置Kotlin 如何在RxJava2.0中处置一次性垃圾,kotlin,rx-java2,rx-android,Kotlin,Rx Java2,Rx Android,我是Rx world的新手,我见过多个如何处置一次性的例子,但我不太理解其中的区别。我正在使用rxjava2.0(v2.2.17)和RxAndroid(v2.1.1) 我的问题是案例1和案例2的区别是什么?在您的申请中,您更喜欢这两种情况中的哪一种 案例1: private val compositeDisposable: CompositeDisposable = CompositeDisposable() adsApiService.getVideos() .subscri
一次性
的例子,但我不太理解其中的区别。我正在使用rxjava2.0(v2.2.17)和RxAndroid(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)}
)
}
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:
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()
方法中清除它
此外,您的示例还存在一些问题:
案例1
您只需将一次性数据添加到compositeDisposable
,不知道为什么要将另外两个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
,因为它没有附加到任何生命周期(活动
,片段
,或视图模型
)
案例2
声明中不需要问号:
private var compositeDisposable:compositeDisposable?=CompositeDisposable()
这个例子在语义上是正确的,尽管
api
应该隐藏在ViewModel
(MVVM架构)或Presenter
(MVP架构)或任何架构中。在view类(MainActivity
)中拥有所有内容是一种糟糕的做法,而且维护起来非常困难 如果您正在学习并开始在项目中引入RxJava/RxAndroid,我不知道为什么在示例2中,您的clear disposable inonPause
。我建议您使用/学习kotlin协同程序。@xinaiz清除确实是可选的。我将对其进行编辑,以减少混淆。-我只看到了一小部分协同程序,我不知道从哪里开始,而且它的实现时间似乎更长。我选择了RxJava,因为它在以后的项目案例1中会很有用:subcribe可以接受4个参数,onNext
,onError
,onComplete
,onSubscribe
我不认为不使用它们有什么意义,因为它们是可用的。案例2:问号是一个打字错误。我目前独自一人在一个大项目中,没有真正的MVVM经验,我知道一些MVP,但不足以正确地实现它。我不打算把所有东西都放在MainActivity中,api
是由lazy设置的,我只是没有显示它,因为它与案例无关。好吧,我理解订阅的用法。但是onComplete
使用没有任何用处,流程已经完成,因此没有什么可处理的。没错,我在网上读到一个问题有点太快了,尽管我自己不得不dispose
。因此,第一个案例是无用的,因为它已经是在后台发生的事情,我不需要再写一遍。