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

我是反应式编程的新手。 所以当我从事件创build一个stream,如onClick,ontouch …

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

谢谢。

Solutions Collecting From Web of "如何从OnClick事件Android创build一个Observable?"

你会做这样的事情

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(); 

由于您使用的是Android,因此您可能已经包含了现在称为ioreactivex:rxandroid的contrib rxjava-android依赖ioreactivex:rxandroid 。 他们已经有一个class,以促进这一点。 该方法是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 } }); 

编辑:从版本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 } }); 

对于Android开发,请看杰克·沃顿的RxBindings 。 例如,它允许您创build一个observable并订阅点击事件:

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

或者甚至更好,使用lambdaexpression式(使用Kotlin , Java 8或Retrolambda ):

 RxView.clicks(myButton) .subscribe(aVoid -> /* do something */); 

如果您使用的是Kotlin,值得注意的是RxBindings还提供了Kotlin扩展function ,允许您直接在目标types上应用每个绑定函数。

你可以使用一个主题。

主体是一种桥梁或代理,既可以作为一个用户,也可以作为一个可观察者。 因为它是一个订阅者,它可以订阅一个或多个Observable,并且由于它是一个Observable,它可以通过重新发送它们来通过它观察到的项目,并且它还可以发出新的项目。

 public class Events { public static PublishSubject <Object> myEvent = PublishSubject.create (); } 

当你想发布的东西

 Events.myEvent.onNext(myObject); 

当你想收到一个事件

 Events.myEvent.subscribe (...); 

编辑

使用体系结构组件LiveData是更好的,因为它处理生命周期和活动或片段,你不必担心取消订阅事件,因为它处理“本身”

 MutableLiveData<Object> event = new MutableLiveData<>(); 

当你想发布的东西

 event.postValue(myObject); 

当你想收到和事件

 event.observe(lifeCycleOwner, (myObject)->...); 

使用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 } }); } }); 

使用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); }); } }); 

或者按照其他人的说法使用RxBinding。

我上面的解决scheme是一个非常普遍的模式,用于将侦听器包装到Observable中。