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 8或Retrolambda):
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中的一种非常通用的模式.
| 归档时间: |
|
| 查看次数: |
28153 次 |
| 最近记录: |