Java 观察移除/处置订阅服务器时要关闭的可关闭资源
我正在开发一个小的子系统,它使用rxjava2集成了两个简单的组件。 这两个组件以一种简单的客户机-服务器方式工作,其中第一个组件通过打开引擎盖下的资源来生成可观察的数据。 资源未公开给第二个组件。 此外,只要可观察对象在使用,它就必须是打开的,但是可观察对象无法确定何时应该关闭它。 就代码而言,示例实现如下所示:Java 观察移除/处置订阅服务器时要关闭的可关闭资源,java,rx-java,rx-java2,Java,Rx Java,Rx Java2,我正在开发一个小的子系统,它使用rxjava2集成了两个简单的组件。 这两个组件以一种简单的客户机-服务器方式工作,其中第一个组件通过打开引擎盖下的资源来生成可观察的数据。 资源未公开给第二个组件。 此外,只要可观察对象在使用,它就必须是打开的,但是可观察对象无法确定何时应该关闭它。 就代码而言,示例实现如下所示: 私人一次性; public void onCreate(){ final Maybe maybeResource=Maybe.defer(()->{ System.out.print
私人一次性;
public void onCreate(){
final Maybe maybeResource=Maybe.defer(()->{
System.out.println(“打开”);
//这是隐藏在引擎盖下的资源,它被封装在可观察的环境中,永远不会暴露出来
最终可关闭资源=()->{};
可能返回。只是(资源)
.doOnDispose(()->{
//从未调用此“析构函数”,导致资源泄漏
系统输出打印项次(“关闭”);
resource.close();
})
//任意数据,不代表我正在使用的数据,但它隐藏了资源
.map(可关闭->新建对象());
});
一次性=maybeResource.subscribe(数据->系统输出.println(“进程:“+data”);
}
公共无效onUserWorflow(){
// ...
系统输出打印项次(“……”);
// ...
}
公共空间{
一次性的,一次性的;
}
我期望得到的结果是:
open
process: <...>
... ... ...
close <-- this is never produced
打开
过程:
... ... ...
关闭我想您需要使用Observable.create()
而不是Maybe。
诸如此类:
final Observable<Object> resourceObservable = Observable.create<Object> {(emitter ->
// do you staff
emitter.onNext(new Object()); //to make observable emit something
emitter.setCancellable (
System.out.println("close");
resource.close();
)
);
disposable = resourceObservable.subscribe(data -> System.out.println("process: " + data));
final Observable resourceObservable=Observable.create{(发射器->
//你们有员工吗
emitter.onNext(new Object());//使可观察对象发射某些东西
emitter.setCancelable(
系统输出打印项次(“关闭”);
resource.close();
)
);
一次性=resourceObservable.subscribe(数据->系统.out.println(“进程:+data”);
我想您需要使用Observable.create()
而不是Maybe。
诸如此类:
final Observable<Object> resourceObservable = Observable.create<Object> {(emitter ->
// do you staff
emitter.onNext(new Object()); //to make observable emit something
emitter.setCancellable (
System.out.println("close");
resource.close();
)
);
disposable = resourceObservable.subscribe(data -> System.out.println("process: " + data));
final Observable resourceObservable=Observable.create{(发射器->
//你们有员工吗
emitter.onNext(new Object());//使可观察对象发射某些东西
emitter.setCancelable(
系统输出打印项次(“关闭”);
resource.close();
)
);
一次性=resourceObservable.subscribe(数据->系统.out.println(“进程:+data”);
Hm,这似乎是我想要的,至少对于Flowable
,谢谢。让我问你:为什么可能不这样做呢?我的意思是,如果我对maybeimitter
使用setcancelable
,资源会在“用户工作流”之前关闭.为什么?还有一个问题:我应该使用setDisposable
而不是setcancelable
?老实说:我对不太熟悉,可能
,我从未使用过它(与可流动、单一、可观察相比,没有看到任何提示)。所以不知道为什么它对你不起作用。关于使用setDisposable
:根据文档,它几乎是一样的,但是你必须实现Disposable
,它有两个方法,而不是cancelable
中的1个。所以我使用setcancelable
,据我的理解,可能是一个可空的单个,我可以看出它有很好的语义。也许行为不同,因为“maybies”只能有一个值,而不是“flowables”,或者我只是遇到了一个bug。需要阅读文档。谢谢!嗯,这似乎是我想要的,至少对于Flowable
,谢谢。让我问你:为什么可能不这样做?我的意思是,如果我对Maybeimitter
使用setCancelable
,资源会在“用户工作流”之前关闭.为什么?还有一个问题:我应该使用setDisposable
而不是setcancelable
?老实说:我对不太熟悉,可能
,我从未使用过它(与可流动、单一、可观察相比,没有看到任何提示)。所以不知道为什么它对你不起作用。关于使用setDisposable
:根据文档,它几乎是一样的,但是你必须实现Disposable
,它有两个方法,而不是cancelable
中的1个。所以我使用setcancelable
,据我的理解,可能是一个可空的单个,我可以看到它有很好的语义。也许行为的不同是因为“maybies”只能有一个值,而不是“flowables”,或者我只是遇到了一个bug。需要阅读文档。谢谢!