我不是RxJava的新手,但是我被一个简单的任务阻挡了。
我有一个公开反应API的数据源,我想要做的就是获取一些数据,返回它并在没有其他任何东西发出时自动关闭连接。
这是我的代码:
public Observable<Object> execute(String query) {
Single<RxConnection> rxConnection = getRxDB().getConnection();
return rxConnection.flatMapObservable(conn -> {
Observable<Object> rxResult = conn.query(query);
return rxResult.doOnCompleted(() -> {
conn.close(); // THIS DOES NOT WORK. I would like to close the connection and to wait without blocking.
});
});
}
conn.query()和conn.close()在不同的调度程序中异步执行。 此代码不起作用,因为conn.close()返回没有订阅者的Completable。另外,如果我在doOnCompleted方法本身手动订阅,则rxResult Observable完成而不等待连接关闭。
我希望&#34;执行(字符串查询)&#34;方法返回一个Observable: - 发出conn.query()调用提取的所有项目 - 当没有更多项目要发出时,它会触发conn.close() - 仅在conn.close()完成后完成;
感谢。
答案 0 :(得分:4)
怎么样:
Observable<Object> rxResult = conn.query(query)
.concatWith(conn.close().toObservable())
.onErrorResumeNext(e ->
conn.close().toObservable().concatWith(Observable.error(e)));
答案 1 :(得分:0)
资源关闭由Observable.using
管理:
Observable<T> obs =
Observable.using(
resourceFactory,
observableFactory,
disposeAction)
此创建方法可确保resourceFactory
创建的资源在终止(完成或错误)或取消订阅时处理。
答案 2 :(得分:0)
因此,您只想在observable订阅时执行查询:
private Observable<Object> executeDeferred(String query) {
// your original execute() method here, including doOnComplete
}
public Observable<Object> execute(String query) {
return Observable.defer(() -> executeDeferred(query));
}
这将确保连接,查询和释放仅在observable获得订阅时发生,而不是在设置期间发生。
编辑:您还需要一个doOnUnsubscribe / doOnTerminate,以便在过早取消订阅时关闭连接。