【问题标题】:How to crash app inside RxJava map operator如何在 RxJava 地图运算符中使应用程序崩溃
【发布时间】:2019-10-04 16:30:30
【问题描述】:

例如,当调用 RxJava 映射运算符后发生 NullPointerException 时,应用程序不会崩溃。我希望应用程序在发生这种情况时崩溃,以便它可以向 crashlytics 等提交报告。

我尝试在 try/catch 块中使用 Exceptions.propagate(),但没有奏效。

我找到的唯一解决方案是在我的错误处理程序中抛出 RuntimeException

    override fun getCategories(): Single<List<Category>> {
        return ApiManager
                .getCategoriesService()
                .getCategories()
                .map { categoriesResponse ->
                        throw KotlinNullPointerException
                        categoriesResponse.categories?.map { categoryResponse ->
                            CategoryMapper().mapFromRemote(categoryResponse)
                        }
                }
    }

在 map 运算符中抛出的 NullPointerException 不会使应用程序崩溃。 如果我在 return 语句之前调用它,它会使应用程序崩溃。

【问题讨论】:

  • 谁订阅了这个,如何订阅?您可能会在订阅的可抛出区域捕获 NPE,它基本上像“try/catch”一样运行,导致它不会崩溃
  • 另外,你为什么要让应用程序崩溃?对于 rxjava 的意图,您可能没有一个好的用例(即尽一切可能不崩溃)
  • 这个我被域层中的 UseCase 调用,而后者又从 ViewModel 调用,使用.subscribeOn(Schedulers.from(AsyncTask.THREAD_POOL_EXECUTOR)) .observeOn(AndroidSchedulers.mainThread())。主要用于开发目的,当mapper出现问题时,p.e NullPointerException,它不会显示在logcat中。
  • > 您很可能在订阅的可抛出区域捕获了 NPE,它基本上像“try/catch”一样运行,导致它不会崩溃 我该如何规避这个问题?例如,我希望在 logcat 上显示错误,这样我就可以了解 Mapper 中的问题出在哪里

标签: android kotlin rx-java2 rx-android


【解决方案1】:

如果我在 return 语句之前调用它,它会使应用程序崩溃。

它崩溃是因为getCategories 方法正在Android 的主线程上运行以构建rx 链。

地图操作符内部抛出的 NullPointerException 不会导致应用崩溃。

它不会使应用程序崩溃,因为此链订阅了一个不是 Android 主线程的线程。例如。你的连锁店有.subscribeOn(Schedulers.io())

我找到的唯一解决方案是在我的错误处理程序中抛出 RuntimeException。

根据document,这是您的链的预期设计:

Observable 通常不会抛出异常。相反,它通过使用 onError 通知终止 Observable 序列来通知任何观察者发生了不可恢复的错误。

因此,您的观察者或操作员应该更典型地响应异常的 onError 通知,而不是捕获异常。

【讨论】:

  • >... getCategories 方法在 Android 的主线程上运行 >... 在不是 Android 主线程的线程上观察到此链。 getCategories 由 UseCase 直接使用 repository.getCategories() 调用。这个UseCase是从像getCategoriesUseCase.execute().subscribeOn(Schedulers.from(AsyncTask.THREAD_POOL_EXECUTOR)).observeOn(AndroidSchedulers.mainThread()).subscribe(::onCategorySuccess, ::onCategoryError)这样的ViewModel调用的,我认为这意味着getCategoriessubscribeOn指定的线程中运行并在主线程中被观察?
  • 是的,你是对的,很抱歉造成混乱,我更新了我的答案
  • 那么关于你的第一条语句,getCategories 在主线程上运行,这就是它崩溃的原因,如果它在 IO 线程中订阅,这怎么可能?
  • getCategories 方法只构建 rx 链,它实际上并不运行链的任务。例如,如果您只调用getCategories(不调用subscribe),map 运算符内的代码将不会运行。它仅在您使用 subscribe 方法订阅链时运行。然后你可以选择订阅 IO 线程。但是构建链的代码,在getCategories 内部仍然从主线程运行(如果从主线程调用)。
【解决方案2】:

好的,所以我认为最接近我想要实现的是在 onError 中调用的错误处理程序中调用 Exceptions.propagate(throwable)。 感谢您为我指明正确的方向@Gustavo @TooManyEduardos2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-26
    • 1970-01-01
    • 2020-12-22
    • 1970-01-01
    • 1970-01-01
    • 2016-06-20
    相关资源
    最近更新 更多