CustomObservable vs Observable.create()?
我正在努力将监听器包装到Observables中。 通常我们使用Observable.create()
来包装它,但有些库更喜欢使用自定义Observables并将其包装在其中,例如RxBinding
,甚至RxJava本身(从我的理解, operators
基本上创建新的Custom Observable来进行操作在里面)。
所以我的问题是:我们可以从Custom Observable获得哪些好处? 它的开销比Observable.create()
因为我们没有为我们生成另一个ObservableCreate
来覆盖ObservableSource
。
我应该使用哪个将现有的库包装成Rx样式(例如:Firebase)?
在某些情况下,创建自定义Observable可以提供更好的开销。
在RxJava 1.x中,扩展Observable
并使用Observable.create(OnSubscribe)
没有任何好处,因为它们实际上是相同的。 但是,为中间运算符创建Observable
比使用带有自定义Operator
lift()
有好处。 Observable.create(Emitter, BackpressureStrategy)
增加了额外保护措施的开销,因为人们倾向于先发现create
第一个并实际重新实现just()
, range()
或from()
,然后才意识到它是不必要的。
在RxJava 2.x中,默认方式是扩展Observable
和其他类型以添加源/中间运算符,这是可能的最低开销。 受保护的创建方法仍然存在但是通过对理解协议的一些小投入,您可以通过使Observer
或Disposable
实现接口或扩展目标外部技术的基类来避免由于create()
而分配额外的对象。
例如,这就是我为Java Swing和RxJava 2编写适配器库的方法:
final class ActionEventObservable extends Observable { final AbstractButton widget; ActionEventObservable(AbstractButton widget) { this.widget = widget; } @Override protected void subscribeActual(Observer super ActionEvent> observer) { AbstractButton w = widget; ActionEventConsumer aec = new ActionEventConsumer(observer, w); observer.onSubscribe(aec); w.addActionListener(aec); if (aec.get() == null) { w.removeActionListener(aec); } } static final class ActionEventConsumer extends AbstractEventConsumer implements ActionListener { private static final long serialVersionUID = -3605206827474016488L; ActionEventConsumer(Observer super ActionEvent> actual, AbstractButton widget) { super(actual, widget); } @Override public void actionPerformed(ActionEvent e) { actual.onNext(e); } @Override protected void onDispose(AbstractButton component) { component.removeActionListener(this); } } }
一些Disposable管理隐藏在一个常见的AbstractEventConsumer
类中,并且各个事件处理程序通常必须实现所需的Listener
并在dispose上调用相应的remove方法。
另外,大多数流行的技术可能已经有了可以使用的RxJava适配器。
我尽可能使用库提供的创建方法,如: generate
, fromCallable
或create
。 它们没有任何开销。 他们负责处理各种内务管理问题,在编写自定义observable时很容易忘记这些问题。
不幸的是,有些情况下你不能使用它们,例如。 什么时候需要特殊安排。 在编写自定义observable之前,我建议您查看generate
或create
库方法的源代码。 确保你了解它的每一点,所以你可以在你的observable中做类似的事情。
- 如何使用JPA本机查询选择具有相同名称的多个列?
- 专用的MySql服务器可与app引擎配合使用
- 文件上传“multipart / form”exceptionorg.apache.commons.fileupload.FileUploadBase $ InvalidContentTypeException
- JEditorPane Hyperlink swing html
- hexJspinner的一些提示? 我的方法是正确的
- 在Java中移动光标
- 在保持JTable默认渲染器的同时对齐JTable单元格中的文本?
- 如何在Java上重新定义已定义的类
- 什么是Java中的DateTime.FromOADate()(在Java中是日期时间的两倍)