私はリアクティブ プログラミングが初めてで、依存関係を持つオブザーバブルの作成について混乱しています。シナリオは次のとおりです。2 つのオブザーバブルA、Bがあります。Observable Aは、 Bによって発行された値に依存します。(したがって、A は B を観察する必要があります)。AとBを構成し、 Vを放出する Observable Cを作成する方法はありますか? RxJava documentationでポインターを探しているだけです。
2913 次
4 に答える
1
あなたの質問は、A が B にどのように依存するかについて少し曖昧なので、オブザーバブルを組み合わせる方法の例をいくつか挙げてみます。
例 - AはBなしでは作成できません- map() を使用します
public class B {
public final int value;
public B(int value) {
this.value = value;
}
}
public class A {
public final B b;
public A(B b) {
this.b = b;
}
}
public Observable<B> createObservableB() {
return Observable.from(new B(0), new B(1), new B(2), new B(3));
}
public Observable<A> createObservableA() {
return createObservableB()
.map(new Func1<B, A>() {
@Override
public A call(B b) {
return new A(b);
}
});
}
例 - Bが出現するたびに、 0 個以上の Aを作成できます- flatMap() を使用します
public class B {
public final int value;
public B(int value) {
this.value = value;
}
}
public class A {
public final int value;
public A(int value) {
this.value = value;
}
}
public Observable<B> createObservableB() {
return Observable.from(new B(0), new B(1), new B(2), new B(3));
}
public Observable<A> createObservableA() {
return createObservableB()
.flatMap(new Func1<B, Observable<? extends A>>() {
@Override
public Observable<? extends A> call(final B b) {
return Observable.create(new Observable.OnSubscribe<A>() {
@Override
public void call(Subscriber<? super A> subscriber) {
for (int i = 0; i < b.value; i++) {
subscriber.onNext(new A(i));
}
subscriber.onCompleted();
}
});
}
});
}
Observables CとVで何を求めているのか正確にはわからないので、Observables を組み合わせる方法をさらにいくつか見てみましょう。
例 - 2 つのオブザーバブルによって放出されたアイテムの各ペアを組み合わせる - zip() を使用する
public class A {
public final int value;
public A(int value) {
this.value = value;
}
}
public class B {
public final int value;
public B(int value) {
this.value = value;
}
}
public class C {
private final A a;
private final B b;
public C(A a, B b) {
this.a = a;
this.b = b;
}
}
public Observable<B> createObservableB() {
return Observable.from(new B(0), new B(1), new B(2), new B(3));
}
public Observable<A> createObservableA() {
return Observable.from(new A(0), new A(1), new A(2), new A(3));
}
public Observable<C> createObservableC() {
return Observable.zip(createObservableA(), createObservableB(),
new Func2<A, B, C>() {
@Override
public C call(A a, B b) {
return new C(a, b);
}
}
);
}
例 - 2 つの Observables の最後の項目を結合する - CombineLatest() を使用する
// Use the same class definitions from previous example.
public Observable<C> createObservableC1() {
return Observable.combineLatest(createObservableA(), createObservableB(),
new Func2<A, B, C>() {
@Override
public C call(A a, B b) {
return new C(a, b);
}
}
);
}
于 2014-08-13T18:53:06.900 に答える
0
私はリアクティブプログラミングも初めてで、あなたのケースにとって興味深いかもしれないいくつかのコードをまとめました
A は B を観察する必要がある
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testng.annotations.Test;
import rx.Observable;
import rx.Subscriber;
import rx.functions.Func1;
import java.util.concurrent.atomic.AtomicBoolean;
import static org.testng.Assert.assertTrue;
public class Q22284380TestCase {
private static final Logger LOGGER = LoggerFactory.getLogger(
Q22284380TestCase.class);
private AtomicBoolean completed = new AtomicBoolean(false);
@Test
public void testName() throws Exception {
final Observable.OnSubscribe<Integer> onSubProduceTwoValues = new Observable.OnSubscribe<Integer>() {
@Override
public void call(final Subscriber<? super Integer> subscriber) {
final Thread thread = new Thread(new Runnable() {
public Integer i = 0;
@Override
public void run() {
final Integer max = 2;
while (i < max) {
subscriber.onNext(i);
i++;
}
subscriber.onCompleted();
}
});
thread.start();
}
};
final Observable<Integer> values = Observable.create(onSubProduceTwoValues);
final Observable<Integer> byTwoMultiplier = values
.flatMap(new Func1<Integer, Observable<Integer>>() {
@Override
public Observable<Integer> call(Integer aValue) {
return doubleIt(aValue);
}
});
byTwoMultiplier.subscribe(new Subscriber<Integer>() {
@Override
public void onNext(Integer a) {
LOGGER.info("" + a);
}
@Override
public void onCompleted() {
completed.set(true);
}
@Override
public void onError(Throwable e) {
LOGGER.error(e.getMessage());
}
});
Thread.sleep(1000L);
assertTrue(completed.get());
}
private Observable<Integer> doubleIt(final Integer value) {
return Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(final Subscriber<? super Integer> subscriber) {
final Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
subscriber.onNext(value * 2);
subscriber.onCompleted();
} catch (Throwable e) {
subscriber.onError(e);
}
}
});
thread.start();
}
});
}
}
値のプロデューサーがあり、flatMap を使用して doubleIt 関数を出力に適用するだけです。何か違うことをするには、A と B の組み合わせである V が必要な場合は、zipを読むことができます。
于 2014-05-04T16:21:51.163 に答える