【问题标题】:RxAndroid Observable method call with error handling带有错误处理的 RxAndroid Observable 方法调用
【发布时间】:2018-06-18 03:23:42
【问题描述】:

我对 RxAndroid 非常陌生,并且仍在努力摆脱我所犯的错误。

Observable.just(RandomComputeManager.getChartData(0,"abcd",new Date()))
                .subscribeOn(Schedulers.computation())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(s -> {
                    System.out.println("RXANDROID"+ s.getFood());
                    Toast.makeText(getActivity(),"HELLO"+s.getFood(),Toast.LENGTH_LONG);
                });

我在这里有一个繁重的计算方法,我试图在 RxJava 的 Schedulers.computation() 线程上运行。(我不知道是否只在 Observable.just 中调用它是正确的方法)。如果没有数据,该方法应该抛出异常。

Class RandomComputeManager{
public static getPieChartData(int a,String b,Date c) throws CustomException {
   if(haveData){
             //All Okay
               }
   else{
       throw new CustomException("No Data");
       }

}

构建失败并出现错误

错误:未报告的异常CustomException;必须被抓住或宣布被扔掉

我尝试向 subscribe 方法添加一个观察者,认为它有一个 onError 方法,但由于被调用方法的返回值存在歧义(Don '不知道它应该是可观察的还是我需要的对象)。 请提出一种处理方法。

【问题讨论】:

    标签: android exception exception-handling rx-java rx-android


    【解决方案1】:

    订阅者函数可以接受另一个 throwable 参数。

    请这样做

    Observable.just(RandomComputeManager.getChartData(0,"abcd",new Date()))
                .subscribeOn(Schedulers.computation())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(s -> {
                    System.out.println("RXANDROID"+ s.getFood());
                    Toast.makeText(getActivity(),"HELLO"+s.getFood(),Toast.LENGTH_LONG);
                }, throwable ->{
    

    });

    【讨论】:

    • 仍然收到此错误 - 错误:未报告的异常 CustomException;必须被抓住或宣布被抛出
    【解决方案2】:
    Observable.fromCallable(RandomComputeManager.getChartData(0,"abcd",new Date()))
                .subscribeOn(Schedulers.computation())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(s -> {
                    System.out.println("RXANDROID"+ s.getFood());
                    Toast.makeText(getActivity(),"HELLO"+s.getFood(),Toast.LENGTH_LONG);
                }, Throwable :: printStackTrace);
    

    这成功了。感谢 Gautam Kumar 和 Raj Suvariya 的帮助。我从Exception handling in rxjava找到了这个细节

    【讨论】:

      【解决方案3】:

      just 方法接受立即解析的参数,因此您实际上将在创建Observable 的同一行运行计算。此外,这也是未捕获您的异常的原因,因为 getChartData 未在 Observable on-subscribe 函数中调用。

      您需要在这里创建Observable 传递一个计算函数,但您正在尝试传递计算结果。

      我已经习惯了 Kotlin,如果我在这里搞砸了 Java lambdas,很抱歉,但你应该在这里使用 fromCallable,就像这样

      Observable.fromCallable(
              () -> RandomComputeManager.getChartData(0, "abcd", new Date())))
      

      fromCallable 接受一个函数,该函数将在您订阅后执行并发出函数结果。

      另外,为了您的目的,最好使用Single,因为您只会发出一个项目。

      Single.fromCallable(
              () -> RandomComputeManager.getChartData(0, "abcd", new Date())))
      

      此外,如果您的 CustomException 已被选中并且您不想崩溃,则必须添加 onError 处理,就像其他人已经建议的那样。

      【讨论】:

        猜你喜欢
        • 2016-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-11
        • 1970-01-01
        • 2023-03-15
        • 1970-01-01
        相关资源
        最近更新 更多