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

Dictionary rxjava-如何在map()中处理异常,dictionary,reactive-programming,rx-java,observable,rx-android,Dictionary,Reactive Programming,Rx Java,Observable,Rx Android,我是RxJava新手,仍在探索它的奇迹 我正在使用map()运算符将Response对象转换为LoginSession对象,但在转换过程中可能会抛出IOException。下面是示例代码 可观察 处理这种情况的最佳方法是什么?除了在subscribe()中检查null之外,我确信这不是最好的方法。您所追求的模式是使用flatMap: public Observable<LoginSession> login(@NonNull String username, @NonNull Str

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

我正在使用
map()
运算符将
Response
对象转换为
LoginSession
对象,但在转换过程中可能会抛出
IOException
。下面是示例代码

可观察
处理这种情况的最佳方法是什么?除了在
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());
    }
公共可观察登录(@NonNull字符串用户名,@NonNull字符串密码){
返回Observable.create(newobservable.OnSubscribe(){
@凌驾

公共无效呼叫(用户您所追求的模式是使用
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());
    }
公共可观察登录(@NonNull字符串用户名,@NonNull字符串密码){
返回Observable.create(newobservable.OnSubscribe(){
@凌驾

公共无效呼叫(用户您所追求的模式是使用
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());
    }
公共可观察登录(@NonNull字符串用户名,@NonNull字符串密码){
返回Observable.create(newobservable.OnSubscribe(){
@凌驾

公共无效呼叫(用户您所追求的模式是使用
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());
    }
公共可观察登录(@NonNull字符串用户名,@NonNull字符串密码){
返回Observable.create(newobservable.OnSubscribe(){
@凌驾


public void call(SubscriberFilter out null值。对于另一个,将map更改为flatmap,在Observable.create()或Observable.defer()中进行操作,并在其中处理错误。但是我希望订阅者知道发生了错误。使用filter()订户永远不会知道转换失败。我也考虑过flatMap。我会尝试一下。然后让它失败并添加重试策略筛选出空值。至于另一个,将map更改为flatMap,使您的操作在一个可观察的内部。create()或Observable.defer()然后在那里处理错误。但是我想让订阅服务器知道发生了错误订户永远不会知道转换失败。我也考虑过flatMap。我会尝试一下。然后让它失败并添加重试策略筛选出空值。至于另一个,将map更改为flatMap,使您的操作在一个可观察的内部。create()或Observable.defer()然后在那里处理错误。但是我想让订阅服务器知道发生了错误订户永远不会知道转换失败。我也考虑过flatMap。我会尝试一下。然后让它失败并添加重试策略筛选出空值。至于另一个,将map更改为flatMap,使您的操作在一个可观察的内部。create()或Observable.defer()然后在那里处理错误。但我希望订阅者知道发生了错误。使用filter()时,订阅者永远不会知道转换失败。我也考虑过flatMap。我会尝试这样做。然后让它失败并添加重试策略是的,我尝试了flatMap,在这种情况下效果很好:)。接受此答案。是的,我尝试了flatMap,该选项适用于此情况:)。接受此答案。是的,我尝试了flatMap,该选项适用于此情况:)。接受此答案。是的,我尝试了flatMap,该选项适用于此情况:)。接受此答案。