Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 如何在RxJava2.0中处置一次性垃圾_Kotlin_Rx Java2_Rx Android - Fatal编程技术网

Kotlin 如何在RxJava2.0中处置一次性垃圾

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

我是Rx world的新手,我见过多个如何处置
一次性
的例子,但我不太理解其中的区别。我正在使用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 in
onPause
。我建议您使用/学习kotlin协同程序。@xinaiz清除确实是可选的。我将对其进行编辑,以减少混淆。-我只看到了一小部分协同程序,我不知道从哪里开始,而且它的实现时间似乎更长。我选择了RxJava,因为它在以后的项目案例1中会很有用:subcribe可以接受4个参数,
onNext
onError
onComplete
onSubscribe
我不认为不使用它们有什么意义,因为它们是可用的。案例2:问号是一个打字错误。我目前独自一人在一个大项目中,没有真正的MVVM经验,我知道一些MVP,但不足以正确地实现它。我不打算把所有东西都放在MainActivity中,
api
是由lazy设置的
,我只是没有显示它,因为它与案例无关。好吧,我理解订阅
的用法。但是
onComplete
使用没有任何用处,流程已经完成,因此没有什么可处理的。没错,我在网上读到一个问题有点太快了,尽管我自己不得不
dispose
。因此,第一个案例是无用的,因为它已经是在后台发生的事情,我不需要再写一遍。