有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何处理SyncOnSubscribe RxJava中generateState中的错误?

我试图掌握创建SyncOnSubscribe的诀窍,但不太确定如果generateState方法在状态初始化期间失败,该怎么办

return Observable.create(new SyncOnSubscribe<MyState, String>() {
    @Override
    protected MyState generateState() {
        return new MyState();   // <---- what if this fails?
    }

    @Override
    protected MyState next(MyState state, Observer<? super String> observer) {
        // do something with state
    }
});

我可以想出几个方法来处理这个问题:

  1. 如果引发运行时异常,库是否会自动 打电话给o.onError?(参见编辑)
  2. 我可以将MyState包装在另一个存储错误的变量中,并且我可以在第一次调用next时自己调用o.onError

我只是好奇有没有一个建议的做法

谢谢

编辑:我尝试在generateState方法中抛出一个运行时异常,我认为它指向我用一个错误包装MyState,我将在next方法中检查这个错误。如果你有更好的建议,请评论/回答

public static Observable<String> getEventsOnSubscribe1() {
    return Observable.create((s) -> {
        throw new UnsupportedOperationException("getEvents3");
    });
};

/** Like 'getEventsOnSubscribe1' but wrap exception and call onError manually.  */
public static Observable<String> getEventsOnSubscribe2() {
    return Observable.create((s) -> {
        try {
            throw new UnsupportedOperationException("getEvents3");
        } catch (Exception ex) {
            s.onError(ex);
        }
    });
};

public static Observable<String> getEventsSyncOnSubscribe() {
    return Observable.create(new SyncOnSubscribe<Channel, String>() {
        @Override
        protected Channel generateState() {
            System.out.println("SyncOnSubscribe.generateState");
            throw new UnsupportedOperationException("Not supported yet.");
        }

        @Override
        protected Channel next(Channel state, Observer<? super String> observer) {
            System.out.println("SyncOnSubscribe.next");
            throw new UnsupportedOperationException("Not supported yet.");
        }

        @Override
        protected void onUnsubscribe(Channel state) {
            System.out.println("SyncOnSubscribe.onUnsubscribe");
            throw new UnsupportedOperationException("Not supported yet.");
        }
    });
}

public static void main(String[] args) throws IOException, TimeoutException {
    getEventsOnSubscribe1()
    //getEventsOnSubscribe2()
    //getEventsOnSyncSubscribe()
            .toBlocking()
            .subscribe(new Subscriber<String>() {
                @Override
                public void onCompleted() {
                    System.out.println("onCompleted");
                }

                @Override
                public void onError(Throwable e) {
                    System.out.println("onError: " + e.getLocalizedMessage());
                }

                @Override
                public void onNext(String t) {
                    System.out.println("onNext: " + t);
                }
            });
}

使用上面的main函数getEventsOnSubscribe1getEventsSyncOnSubscribe都会调用订户onError,但它们会让程序挂起。使用getEventsOnSubscribe2包装异常并手动调用s.onError,程序可以退出


共 (0) 个答案