RxAndroid Observable方法调用错误处理

时间:2018-06-16 20:29:26

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

我是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不知道它应该是一个可观察的还是我需要的对象。 请建议一种处理此问题的方法。

3 个答案:

答案 0 :(得分:2)

订阅者函数可以采用另一个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 ->{

});

答案 1 :(得分: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

中找到了这个细节

答案 2 :(得分:1)

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

这里需要的是创建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处理,就像其他人已经建议的那样。