带有错误处理的 RxAndroid Observable 方法调用
RxAndroid Observable method call with error handling
我是 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;必须被捕获或声明被抛出
我试过向订阅方法添加一个观察者,认为它有一个 onError 方法,但既不能解决这个问题,也不能获取我的数据,因为 return 值有些歧义被调用方法的(不知道它应该是一个可观察的还是我需要的对象)。
请建议一种处理方法。
订阅者函数可以接受另一个 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 ->{
});
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 的帮助。我从
中找到了这个细节
just
方法接受立即解析的参数,因此您实际上将要 运行 在创建 Observable
的同一行进行计算。此外,这也是您的异常未被捕获的原因,因为 getChartData
未在 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
处理,就像其他人已经建议的那样。
我是 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;必须被捕获或声明被抛出
我试过向订阅方法添加一个观察者,认为它有一个 onError 方法,但既不能解决这个问题,也不能获取我的数据,因为 return 值有些歧义被调用方法的(不知道它应该是一个可观察的还是我需要的对象)。 请建议一种处理方法。
订阅者函数可以接受另一个 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 ->{
});
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 的帮助。我从
just
方法接受立即解析的参数,因此您实际上将要 运行 在创建 Observable
的同一行进行计算。此外,这也是您的异常未被捕获的原因,因为 getChartData
未在 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
处理,就像其他人已经建议的那样。