gpt4 book ai didi

android - 从RxJava中的Observable发出null

转载 作者:行者123 更新时间:2023-12-02 13:13:01 25 4
gpt4 key购买 nike

我已经尝试了很长时间,但无法在RxJava和Kotlin中处理空值

我有一个Room数据库,该数据库从数据库返回一些实体(主题)的列表。我需要从列表中选择一个随机项,或者如果列表为空,则需要执行其他操作。

在阅读了关于SO的各种答案并尝试了不同的方法之后。我尝试使用Optional:

fun getRandomTopic(): Single<Optional<Topic>> {
return topicDao.getAll().flatMap { topics ->
if (topics.isEmpty()) {
Single.just(Optional.ofNullable(null))
}

val index = (Math.random() * topics.size).toInt()
Single.just(Optional.of(topics[index]))
}
}

在我的 Activity 中观察到此功能:
viewModel.getRandomTopic()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe { result ->
if (result.isPresent) {
viewModel.currentTopic.postValue(result.get())
} else {
Toast.makeText(this, "No topic found", Toast.LENGTH_SHORT).show()
}
})

但是,这总是触发空指针异常或 IndexOutOfBoundsException:
io.reactivex.exceptions.OnErrorNotImplementedException: Index: 0, Size: 0
at io.reactivex.internal.functions.Functions$14.accept(Functions.java:229)
at io.reactivex.internal.functions.Functions$14.accept(Functions.java:226)
at io.reactivex.internal.observers.ConsumerSingleObserver.onError(ConsumerSingleObserver.java:44)
at io.reactivex.internal.operators.single.SingleObserveOn$ObserveOnSingleObserver.run(SingleObserveOn.java:79)
at io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run(HandlerScheduler.java:111)
at android.os.Handler.handleCallback(Handler.java:761)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:156)
at android.app.ActivityThread.main(ActivityThread.java:6523)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)
Caused by: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.get(ArrayList.java:411)
at cz.xxx.TopicViewModel$getRandomTopic$1.apply(TopicViewModel.kt:31)
at cz.xxx.TopicViewModel$getRandomTopic$1.apply(TopicViewModel.kt:17)

看来情况
if (topics.isEmpty()) {
Single.just(Optional.ofNullable(null))
}

会以某种方式被忽略,即使数组为空,该语句也会继续。我在这里做错了什么?

最佳答案

您已经基本描述了问题所在。如果您查看Android Studio中的源代码,则表达式Single.just(Optional.ofNullable(null))不会被评估为.flatMap()的返回值。

AS screenshot

只有lambda的最后一个值是。我建议您写下诸如return@something的返回语句,以使代码更清晰易懂。解?

fun getRandomTopic(): Single<Optional<Topic>> {
return topicDao.getAll().flatMap { topics ->
return@flatMap if (topics.isEmpty()) {
Single.just(Optional.ofNullable<Topic>(null))
} else {
val index = (Math.random() * topics.size).toInt()
Single.just(Optional.of(topics[index]))
}
}
}

关于android - 从RxJava中的Observable发出null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54386833/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com