Я пытаюсь подписаться на SingleSource
, я реализовал оба метода onSuccess
и onError
из subscribe
, вот мой код:
disposable.add(repository
.getUser1()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
toast(it)
}, {
toast(it.message ?: "Error")
}))
Проблема в том, когдаВозникла исключительная ситуация в репозитории, которая не перехватывается в onError
Вот моя реализация репозитория:
class Repository(private val sp: SharedPreferences) {
// It crashes
fun getUser1(): Single<String> = generateUser(name, "Hello")
// it doesn't crash
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")
}
А вот журнал сбоя:
09-24 10: 13: 40.930 6934-6934 / com.mosius.samplerxtest E / AndroidRuntime: ОСНОВНОЕ ИСКЛЮЧЕНИЕ: главный Процесс: com.mosius.samplerxtest, PID: 6934 java.lang.RuntimeException: java.lang.reflect.InvocationTargetExceptionв com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run (RuntimeInit.java:503) в com.android.internal.os.ZygoteInit.main (ZygoteInit.java:826), вызванный: java.lang.reflect.InvocationTargetExceptionна java.lang.reflect.Method.invoke (собственный метод) на com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run (RuntimeInit.java:493) на com.android.internal.os.ZygoteInit.main (ZygoteInit.Java: 826) Вызвано: com.mosius.samplerxtest.NoNameExceptИон: имя не предоставляется в 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 (View.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.os.Looper.loop (Looper.java:164) на 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)
Чем отличаются этидве реализации?