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方法。