RxJava - подписка не перехватывает исключение, вызывающее сбой - PullRequest
0 голосов
/ 23 сентября 2018

Я пытаюсь подписаться на 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)

Чем отличаются этидве реализации?

1 Ответ

0 голосов
/ 24 сентября 2018

В методе getUser1() SingleSource еще не создан, поэтому он не может управлять исключением Rx.

Во втором методе имя выбирается в области Rx, поэтомуэто может обработать исключение

...