私はリアクティブプログラミングの初心者です。だから、onClick、ontouchなどのイベントからストリームを作成するときに問題があります...
誰でもこの問題を解決するのを手伝ってもらえますか。
ありがとう。
次のようなことをします。
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を使用しているため、contrib rxjava-Android
依存関係は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
}
});
編集:バージョン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開発については、Jake Whartonの RxBindings をご覧ください。たとえば、オブザーバブルを作成し、クリックイベントにサブスクライブできます。
RxView.clicks(myButton)
.subscribe(new Action1<Void>() {
@Override
public void call(Void aVoid) {
/* do something */
}
});
または、さらに良いことに、ラムダ式( Kotlin 、 Java 8 または Retrolambda のいずれかを使用):
RxView.clicks(myButton)
.subscribe(aVoid -> /* do something */);
Kotlinを使用している場合、RxBindingsには Kotlin拡張関数 が用意されており、各バインディング関数をターゲットタイプに直接適用できることに注意してください。
件名を使用できます。
Subject は、SubscriberとObservableの両方として機能する一種のブリッジまたはプロキシです。サブスクライバーであるため、1つ以上のObservableをサブスクライブできます。また、Observableであるため、監視するアイテムを再送信することで通過でき、新しいアイテムを送信することもできます。
public class Events {
public static PublishSubject <Object> myEvent = PublishSubject.create ();
}
何かを公開したいとき
Events.myEvent.onNext(myObject);
イベントを受け取りたいとき
Events.myEvent.subscribe (...);
**アーキテクチャコンポーネントの使用LiveDataは、ライフサイクルとアクティビティまたはフラグメントを処理し、UIコンポーネントのライフサイクルを監視するため、イベントのサブスクライブを心配する必要がないため、より優れています。
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
}
});
}
});
ラムダを使用すると、より見栄えがよくなります。
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を使用します。
上記の私のソリューションは、リスナーをObservableにラップする非常に一般的なパターンです。
拡張機能を使用して、Kotlinでこれを簡単に行うことができます。たとえば、次のような拡張関数を作成します。
fun View.observableClickListener(): Observable<View> {
val publishSubject: PublishSubject<View> = PublishSubject.create()
this.setOnClickListener { v -> publishSubject.onNext(v) }
return publishSubject
}
そして、この拡張機能を次のように使用します。
viewIWantToObserveClicks.observableClickListener().subscribe()