我正在尝试习惯于rxjava
,我试图在Observable中调用下面的QuoteReader
。我不知道如何处理抛出的异常,
public class QuoteReader {
public Map<String, Object> getQuote() throws IOException{
OkHttpClient okHttpClient = new OkHttpClient();
Request request = new Request.Builder().url("http://quotes.rest/qod.json").build();
Gson gson = new Gson();
Map<String, Object> responseMap = null;
try(Response response = okHttpClient.newCall(request).execute()) {
responseMap = gson.fromJson(response.body().string(), Map.class);
System.out.println("response map : "+responseMap);
} catch(IOException ioe) {
ioe.printStackTrace();
throw ioe;
} finally {
okHttpClient = null;
request = null;
}
return responseMap;
}
}
以下是我要编写的rx代码,
rx.Observable.just(new QuoteReader().getQuote()) //compile time error saying unhandled exception
.subscribe(System.out::println);
我应该如何更新代码来处理异常。谢谢!
答案 0 :(得分:7)
使用允许你的方法抛出的fromCallable
(另外,它会被懒惰地评估,而不是在你进入Observable世界之前):
rx.Observable.fromCallable(() -> new QuoteReader().getQuote())
.subscribe(System.out::println, Throwable::printStackTrace);
答案 1 :(得分:0)
Observable
有另一种工厂方法,称为create
。这为您提供了Observer
作为lambda表达式的输入。 Observer
是一种回调对象,有三种方法:onNext(T t)
,onError(Throwable e)
和onCompleted
。我读到你是RxJava的新手,所以这里有一点额外的旁注:Rx合同规定Observer
可以接收零个或多个onNext
个电话,然后是也许 onError
或onCompleted
来电。正则表达式如下所示:onNext* (onError|onCompleted)?
。
现在你知道了,你可以使用Observable.create
实现你的操作:
Observable.create(observer -> {
try {
observer.onNext(new QuoteReader.getQuote());
observer.onCompleted();
}
catch (Throwable e) {
observer.onError(e);
}
}
请注意,在您订阅Observable
之前,此代码不会执行任何操作,而不是您在问题中所做的那样!
答案 2 :(得分:0)
Observable管道不允许您抛出异常。您必须使用runtimeExceptions。所以改变你的代码应该是这样的。
try(Response response = okHttpClient.newCall(request).execute()) {
responseMap = gson.fromJson(response.body().string(), Map.class);
System.out.println("response map : "+responseMap);
} catch(IOException ioe) {
ioe.printStackTrace();
new RuntimeException(ioe);