如何从OnClick事件Android创建一个Observable?

Tha*_* Le 36 android reactive-programming rx-java

我是反应式编程的新手.所以当我从一个事件创建一个流时遇到问题,比如onClick,ontouch ......

任何人都可以帮我解决这个问题.

谢谢.

Mig*_*gne 52

你会做这样的事情:

Observable<View> clickEventObservable = Observable.create(new Observable.OnSubscribe<View>() {
    @Override
    public void call(final Subscriber<? super View> subscriber) {
        viewIWantToMonitorForClickEvents.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (subscriber.isUnsubscribed()) return;
                subscriber.onNext(v);
            }
        });
    }
});

// You can then apply all sorts of operation here
Subscription subscription = clickEventObservable.flatMap(/*  */);

// Unsubscribe when you're done with it
subscription.unsubscribe();
Run Code Online (Sandbox Code Playgroud)

由于您使用的是Android,因此您可能已经包含了rxjava-android现在称为的contrib 依赖项ioreactivex:rxandroid.他们已经有一个课程来促进这一点.方法是ViewObservable.clicks.你可以像这样使用它.

Observable<View> buttonObservable = ViewObservable.clicks(initiateButton, false);
    buttonObservable.subscribe(new Action1<View>() {
        @Override
        public void call(View button) {
            // do what you need here
        }
    });
Run Code Online (Sandbox Code Playgroud)

编辑:从版本1.x开始,ViewObservable许多帮助程序类都从RxAndroid 中删除.您将需要RxBinding库.

Observable<Void> buttonObservable = RxView.clicks(initiateButton);
    buttonObservable.subscribe(new Action1<Void>() {
        @Override
        public void call(Void x) {
            // do what you need here
        }
    });
Run Code Online (Sandbox Code Playgroud)


Mat*_*att 26

对于Android开发,请查看Jake Wharton的RxBindings.例如,它允许您创建一个observable并订阅Click事件:

RxView.clicks(myButton)
        .subscribe(new Action1<Void>() {
            @Override
            public void call(Void aVoid) {
                /* do something */
            }
        });
Run Code Online (Sandbox Code Playgroud)

或者更好的是,使用lambda表达式(使用Kotlin,Java 8Retrolambda):

RxView.clicks(myButton)
        .subscribe(aVoid -> /* do something */);
Run Code Online (Sandbox Code Playgroud)

如果你正在使用Kotlin,值得注意的是RxBindings还提供了Kotlin扩展函数,允许你直接在目标类型上应用每个绑定函数.


Rog*_*eto 16

你可以使用一个主题.

一个主题是一种桥或代理的是同时作为用户和可观察到的.因为它是一个订阅者,它可以订阅一个或多个Observable,并且因为它是一个Observable,它可以通过重新发送它来传递它观察到的项目,并且它也可以发出新项目.

public class Events {
    public static PublishSubject <Object> myEvent = PublishSubject.create ();
}
Run Code Online (Sandbox Code Playgroud)

当你想发布一些东西时

Events.myEvent.onNext(myObject);
Run Code Online (Sandbox Code Playgroud)

当您想要收到活动时

Events.myEvent.subscribe (...);
Run Code Online (Sandbox Code Playgroud)

编辑

**使用体系结构组件LiveData更好,因为它处理生命周期和活动或片段,您不必担心取消订阅事件,因为它会观察ui组件的生命周期.

MutableLiveData<Object> event = new MutableLiveData<>();
Run Code Online (Sandbox Code Playgroud)

当你想发布一些东西时

event.postValue(myObject);
Run Code Online (Sandbox Code Playgroud)

当你想要接收和事件

event.observe(lifeCycleOwner, (myObject)->...);
Run Code Online (Sandbox Code Playgroud)


Kav*_*avi 14

使用RxJava 2:

return Observable.create(new ObservableOnSubscribe<View>() {
    @Override
    public void subscribe(ObservableEmitter<View> e) throws Exception {
        clickView.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                e.setCancellable(new Cancellable() {
                    @Override
                    public void cancel() throws Exception {
                        view.setOnClickListener(null);
                    }
                });
                e.onNext(view); // Or whatever type you're observing
            }
        });
    }
});
Run Code Online (Sandbox Code Playgroud)

使用lambdas看起来更好看:

return Observable.create(new ObservableOnSubscribe<View>() {
    @Override
    public void subscribe(ObservableEmitter<View> e) throws Exception {
        keypad.setOnClickListener(view -> {
            e.setCancellable(() -> view.setOnClickListener(null));
            e.onNext(view);
        });
    }
});
Run Code Online (Sandbox Code Playgroud)

或者像其他人所说的那样使用RxBinding.

我上面的解决方案是将侦听器包装到Observable中的一种非常通用的模式.