RxJava2 Flowable onErrorReturn 未调用

RxJava2 Flowable onErrorReturn not called

说我需要用 Flowable 包装 BroadcastReceiver:

        Flowable
                .create<Boolean>({ emitter ->
                    val broadcastReceiver = object : BroadcastReceiver() {
                        override fun onReceive(context: Context?, intent: Intent?) {
                            throw RuntimeException("Test exception")
                        }
                    }
                    application.registerReceiver(broadcastReceiver, IntentFilter(LocationManager.PROVIDERS_CHANGED_ACTION))
                }, BackpressureStrategy.MISSING)
                .onErrorReturn { false }

然后我需要在一个地方捕获 Flowable 中抛出的任何异常。

我认为 onErrorReturn 应该能够在 broadcastReceiver 中捕捉到 throw RuntimeException("Test exception") 但它没有捕捉到那个异常和应用程序崩溃。

当然,我可以用 try/catch 将任何内容包装在 BroadcastReceiver 中。但实际上,我那里有很多源代码,所以添加 try/catch 会使源代码变得非常混乱。

有什么方法可以在一个地方捕获Flowable中任何一行抛出的所有异常吗?

如果 Flowable#create() 遵循 Flowable 的契约,如果你有错误并想通过流传递它,你需要捕获它并调用 emitter.onError()。如果这样做,Flowable.onErrorReturn() 将按预期开始工作。

要正确 register/unregister BroadcastReceiver 并处理异常,您可以使用该方法

Flowable
        .create<Boolean>({ emitter ->
            val broadcastReceiver = object : BroadcastReceiver() {
                override fun onReceive(context: Context?, intent: Intent?) {
                    try {
                        throw RuntimeException("Test exception")
                    } catch(e: Throwable) {
                        emitter.tryOnError(e)
                    }
                }
            }
            try {
                application.registerReceiver(broadcastReceiver, IntentFilter(LocationManager.PROVIDERS_CHANGED_ACTION))

                emitter.setCancellable {
                    application.unregisterReceiver(broadcastReceiver)
                }
            } catch (e: Throwable) {
                emitter.tryOnError(e)
            }
        }, BackpressureStrategy.MISSING)
        .onErrorReturn { false }