rxjava - 如何处理 map() 中的异常
rxjava - how to handle exception within map()
我是 RxJava 的新手,仍在探索它的奇迹。
我正在使用 map()
运算符将 Response
对象转换为 LoginSession
对象,但在转换过程中可能会抛出 IOException
。以下是示例代码。
可观察
public Observable<LoginSession> login(@NonNull String username, @NonNull String password) {
return Observable.create(new Observable.OnSubscribe<Response>() {
@Override
public void call(Subscriber<? super Response> subscriber) {
loginInternal(username, password, subscriber);
}
}).map(response -> {
try {
LoginSession session = Utils.methodThatCanReturnAnIoException(response.body().byteStream(), LoginSession.class);
return session;
} catch(IOException e){
return null; // what should I do here ????
}
}).subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread());
}
订户
login("username", "password").subscribe( loginSession -> {
//i hate checking for null here. there should be a better way...
if(loginSession != null){
Log.d("MY_SESSION", "Login session successful.");
} else {
Log.d("MY_SESSION", "Login Session is null unfortunately.");
}
});
处理这种情况的最佳方法是什么?除了在 subscribe()
中检查 null,我确信这不是最好的方法。
你想要的模式是使用flatMap
:
public Observable<LoginSession> login(@NonNull String username, @NonNull String password) {
return Observable.create(new Observable.OnSubscribe<Response>() {
@Override
public void call(Subscriber<? super Response> subscriber) {
loginInternal(username, password, subscriber);
}
}).flatMap(response -> {
try {
LoginSession session = Utils.methodThatCanReturnAnIoException(response.body().byteStream(), LoginSession.class);
return Observable.just(session);
} catch(IOException e){
return Observable.error(e);
}
}).subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread());
}
然后在订阅者中使用onError
方法。
我是 RxJava 的新手,仍在探索它的奇迹。
我正在使用 map()
运算符将 Response
对象转换为 LoginSession
对象,但在转换过程中可能会抛出 IOException
。以下是示例代码。
可观察
public Observable<LoginSession> login(@NonNull String username, @NonNull String password) {
return Observable.create(new Observable.OnSubscribe<Response>() {
@Override
public void call(Subscriber<? super Response> subscriber) {
loginInternal(username, password, subscriber);
}
}).map(response -> {
try {
LoginSession session = Utils.methodThatCanReturnAnIoException(response.body().byteStream(), LoginSession.class);
return session;
} catch(IOException e){
return null; // what should I do here ????
}
}).subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread());
}
订户
login("username", "password").subscribe( loginSession -> {
//i hate checking for null here. there should be a better way...
if(loginSession != null){
Log.d("MY_SESSION", "Login session successful.");
} else {
Log.d("MY_SESSION", "Login Session is null unfortunately.");
}
});
处理这种情况的最佳方法是什么?除了在 subscribe()
中检查 null,我确信这不是最好的方法。
你想要的模式是使用flatMap
:
public Observable<LoginSession> login(@NonNull String username, @NonNull String password) {
return Observable.create(new Observable.OnSubscribe<Response>() {
@Override
public void call(Subscriber<? super Response> subscriber) {
loginInternal(username, password, subscriber);
}
}).flatMap(response -> {
try {
LoginSession session = Utils.methodThatCanReturnAnIoException(response.body().byteStream(), LoginSession.class);
return Observable.just(session);
} catch(IOException e){
return Observable.error(e);
}
}).subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread());
}
然后在订阅者中使用onError
方法。