有 Java 编程相关的问题?

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

java CustomObservable vs Observable。创建()?

我正在将侦听器包装成可观察对象。通常我们使用Observable.create()来包装它,但是有些库更喜欢使用自定义的可观察对象,并在其中包装一些东西,比如RxBinding,甚至是RxJava本身(据我所知,operators基本上是创建新的自定义可观察对象来在其内部进行操作)

因此,我的问题是: 我们可以从Custom Observable中获得什么好处?它的开销比Observable.create()要低,因为我们不会生成另一个ObservableCreate来为我们覆盖ObservableSource

我应该使用哪一个将现有库包装成Rx样式(例如:Firebase)


共 (2) 个答案

  1. # 1 楼答案

    在某些情况下,创建自定义可观察对象会带来额外的开销

    在rxjava1中。x、 扩展Observable和使用Observable.create(OnSubscribe)没有任何好处,因为它们实际上是相同的。但是,为中间运算符创建Observable比将lift()与自定义Operator一起使用有好处Observable.create(Emitter, BackpressureStrategy)通过额外的保护增加了开销,因为人们倾向于首先找到{},实际上在意识到它是不必要的之前用它重新实现{}、{}或{}

    在rxjava2中。x、 默认方法是扩展Observable和其他类型以添加源/中间运算符,这是最低的开销。受保护的创建方法仍然存在,但只需对理解协议进行少量投资,就可以通过让ObserverDisposable也实现接口或扩展目标外部技术的基类来避免由于create()而分配额外对象

    例如,我就是这样为Java Swing和RxJava 2编写适配器库的:

    final class ActionEventObservable extends Observable<ActionEvent> {
    
        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<ActionEvent, AbstractButton>
                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);
            }
        }
    }
    

    一些一次性管理隐藏在公共AbstractEventConsumer类中,单个事件处理程序大多必须实现所需的Listener并在dispose上调用适当的remove方法

    另一方面,最流行的技术可能已经有了可以使用的RxJava适配器

  2. # 2 楼答案

    只要可能,我都会使用库提供的创建方法,如:generatefromCallablecreate。它们没有开销。它们处理各种内务管理问题,在编写自定义可观察对象时,您很容易忘记这些问题

    不幸的是,在某些情况下,您无法使用它们,例如,当您需要特别安排时。在编写自定义observable之前,我建议查看generatecreate库方法的源代码。确保你理解它的每一个细节,这样你就可以在你的可观察到的事物中做类似的事情