web-dev-qa-db-ja.com

OnClick Event AndroidからObservableを作成する方法は?

私はリアクティブプログラミングの初心者です。だから、onClick、ontouchなどのイベントからストリームを作成するときに問題があります...

誰でもこの問題を解決するのを手伝ってもらえますか。

ありがとう。

35
Thanh Le

次のようなことをします。

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
        }
    });
51
Miguel Lavigne

Android開発については、Jake Whartonの RxBindings をご覧ください。たとえば、オブザーバブルを作成し、クリックイベントにサブスクライブできます。

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

または、さらに良いことに、ラムダ式( KotlinJava 8 または Retrolambda のいずれかを使用):

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

Kotlinを使用している場合、RxBindingsには Kotlin拡張関数 が用意されており、各バインディング関数をターゲットタイプに直接適用できることに注意してください。

26
Matt

件名を使用できます。

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)->...);
16

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にラップする非常に一般的なパターンです。

14
Kavi

拡張機能を使用して、Kotlinでこれを簡単に行うことができます。たとえば、次のような拡張関数を作成します。

    fun View.observableClickListener(): Observable<View> {
    val publishSubject: PublishSubject<View> = PublishSubject.create()
    this.setOnClickListener { v -> publishSubject.onNext(v) }
    return publishSubject
}

そして、この拡張機能を次のように使用します。

viewIWantToObserveClicks.observableClickListener().subscribe()
0
user3783123