我想订阅一个
SingleSource
,我已经实现了这两个
onSuccess
以及
onError
属于
subscribe
方法,这是我的代码:
disposable.add(repository
.getUser1()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
toast(it)
}, {
toast(it.message ?: "Error")
}))
问题是,当存储库中发生异常时,它不会被捕获
以下是我的存储库实现:
class Repository(private val sp: SharedPreferences) {
fun getUser1(): Single<String> = generateUser(name, "Hello")
fun getUser2(): Single<String> = Single.fromCallable { name }.flatMap { generateUser(it, "Hello") }
private var name: String
get() = sp.getString("user", null) ?: throw NoNameException()
set(value) = sp.edit().putString("user", value).apply()
private fun generateUser(name: String, message: String): Single<String> = Single.just("$message $name")
}
下面是事故日志:
致命异常:main
进程:com.mosius.samplerxtest,PID:6934
在com.android.internal.os.ZygoteInit.main(ZygoteInit。java:826)
原因:java.lang.reflect.InvocationTargetException
在com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit。java:493)
原因:com.mosius.samplerxtest.NoNameException:未提供名称
在com.mosius.samplerxtest.Repository.getName(Repository.kt:17)
位于com.mosius.samplerxtest.Repository.getUser1(Repository.kt:10)
在com.mosius.samplerxtest.MainActivity$onCreate$1.onClick(MainActivity.kt:24)
在android.view.view.performClick(view。java:6597)
在android.view.view.performClickInternal(视图。java:6574)
在android.view.view.access$3100(查看。java:778)
在android.view.view$PerformClick.run(view。java:25881)
在android.os.Handler.handleCallback(Handler。java:873)
在android.os.Handler.dispatchMessage(Handler。java:99)
在android.app.ActivityThread.main(ActivityThread。java:6649)
位于java.lang.reflect.Method.invoke(本机方法)
在com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit。java:493)
在com.android.internal.os.ZygoteInit.main(ZygoteInit。java:826)
这两种实现有什么不同?