2017-10-29 13 views
0

RxJavaの世界で科目を使用することは一般的にお勧めできません。私は被験者が容易に達成できる被験体の特性変化を観察しようとしている。私はrx.netがObservable.FromEvent()を提供してこの状況を簡単に処理できることを知っていますが、それらが非主題ベースのJavaの代替であるかどうかは疑問でした。RxJava - 科目の使用

答えて

0

あなたはObservable.createメソッドを介してその機能を実現することができます。

Observable.create(emitter -> { 
    PropertyObserver x = event -> emitter.onNext(event) 
    yourObject.addObserver(x); 
    // Set cancellable after adding observer, if the observable is 
    // disposed already it will properly remove the listener. 
    emitter.setCancellable(() -> yourObject.removeObserver(x)); 
}); 

しかし、あなたがするたびに、この観測可能はそれが関連付けられているオブジェクトに新しいリスナーを追加して使用されていることを認識する必要があります。複数のオブザーバーがオブジェクトのイベントに依存している場合は、share()publish()演算子を適用することで回避できます。

0

createオペレータを使用してください。ここでは、完全なサンプルを提供します。

package xdean.stackoverflow.rx; 

import java.util.LinkedList; 
import java.util.List; 

import io.reactivex.Observable; 
import io.reactivex.ObservableEmitter; 
import io.reactivex.disposables.Disposable; 

public class Q47000589 { 
    public static void main(String[] args) { 
    Property<Integer> p = new Property<>(1); 
    Disposable d = p.listen().subscribe(i -> System.out.println("Listen: " + i)); 
    p.set(2); 
    p.set(3); 
    d.dispose(); 
    p.set(4); 
    p.set(5); 
    } 

    public static class Property<T> { 
    T value; 
    List<ObservableEmitter<? super T>> emitters = new LinkedList<>(); 

    public Property(T value) { 
     this.value = value; 
    } 

    T get() { 
     return value; 
    } 

    void set(T t) { 
     this.value = t; 
     emitters.forEach(e -> e.onNext(t)); 
    } 

    Observable<T> listen() { 
     return Observable.create(e -> { 
     emitters.add(e); 
     e.onNext(value); 
     e.setCancellable(() -> emitters.remove(e)); 
     }); 
    } 
    } 
} 

されて出力される。

Listen: 1 
Listen: 2 
Listen: 3 
関連する問題