代码之家  ›  专栏  ›  技术社区  ›  Mosius sMiLo

RxJava-Subscribe未捕获导致崩溃的异常

  •  0
  • Mosius sMiLo  · 技术社区  · 6 年前

    我想订阅一个 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) {
    
        // 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")
    
    }
    

    下面是事故日志:

    致命异常: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)

    这两种实现有什么不同?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Mosius sMiLo    6 年前

    getUser1() 方法, SingleSource

    在第二种情况下,名称是在Rx范围内获取的,因此它可以处理异常