rxjava - 如何在map()中处理异常

时间:2015-08-13 21:45:18

标签: dictionary reactive-programming rx-java observable rx-android

我是RxJava的新手,仍在探索它的奇迹。

我正在使用Response运算符将LoginSession对象转换为map()对象,但转换期间可能会抛出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,我肯定不是最好的方法。

1 个答案:

答案 0 :(得分:3)

您所使用的模式是使用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方法。