经过一些试验,人们在使用时似乎需要一些照顾。
BehaviorSubject
对象及其使用并不像我从各种接口的名称中推断的那样明显。
作为一种测试方法来演示我目前正在做的工作:
@Test
public void test()
{
System.out.println("Executing test on thread ID: " + Thread.currentThread().getId());
final BehaviorSubject<Integer> rotorBehaviour = BehaviorSubject.create();
rotorBehaviour.subscribeOn(Schedulers.single());
rotorBehaviour.subscribe(new Observer<Integer>()
{
@Override
public void onSubscribe(final Disposable d)
{
System.out.println("onSubscribe() called on thread ID: " + Thread.currentThread().getId());
}
@Override
public void onNext(final Integer integer)
{
System.out.println("onNext() called on thread ID: " + Thread.currentThread().getId());
}
@Override
public void onError(final Throwable e)
{
System.out.println("onError() called on thread ID: " + Thread.currentThread().getId());
}
@Override
public void onComplete()
{
System.out.println("onComplete() called on thread ID: " + Thread.currentThread().getId());
}
});
rotorBehaviour.onNext(1);
rotorBehaviour.onNext(2);
}
这会导致不期望的结果:
对线程ID:1执行测试
在线程ID:1上调用OnSubscribe()。
在线程ID:1上调用OnNext()。
在线程ID:1上调用OnNext()。
进程已完成,退出代码为0
(不希望是因为
onNext()
在主线程上调用)
修改代码以使用
Observable
从呼叫返回到
subscribeOn
给出相同的不期望结果:
@Test
public void test()
{
System.out.println("Executing test on thread ID: " + Thread.currentThread().getId());
final BehaviorSubject<Integer> rotorBehaviour = BehaviorSubject.create();
Observable<Integer> rotorObservable = rotorBehaviour.subscribeOn(Schedulers.single());
rotorObservable.subscribe(new Observer<Integer>()
{
@Override
public void onSubscribe(final Disposable d)
{
System.out.println("onSubscribe() called on thread ID: " + Thread.currentThread().getId());
}
@Override
public void onNext(final Integer integer)
{
System.out.println("onNext() called on thread ID: " + Thread.currentThread().getId());
}
@Override
public void onError(final Throwable e)
{
System.out.println("onError() called on thread ID: " + Thread.currentThread().getId());
}
@Override
public void onComplete()
{
System.out.println("onComplete() called on thread ID: " + Thread.currentThread().getId());
}
});
rotorBehaviour.onNext(1);
rotorBehaviour.onNext(2);
}
结果:
对线程ID:1执行测试
在线程ID:1上调用OnSubscribe()。
在线程ID:1上调用OnNext()。
在线程ID:1上调用OnNext()。
进程已完成,退出代码为0
但是使用
observeOn()
方法确实给出了所需的结果:
@Test
public void test()
{
System.out.println("Executing test on thread ID: " + Thread.currentThread().getId());
final BehaviorSubject<Integer> rotorBehaviour = BehaviorSubject.create();
Observable<Integer>rotorObservable = rotorBehaviour.observeOn(Schedulers.single());
rotorObservable.subscribe(new Observer<Integer>()
{
@Override
public void onSubscribe(final Disposable d)
{
System.out.println("onSubscribe() called on thread ID: " + Thread.currentThread().getId());
}
@Override
public void onNext(final Integer integer)
{
System.out.println("onNext() called on thread ID: " + Thread.currentThread().getId());
}
@Override
public void onError(final Throwable e)
{
System.out.println("onError() called on thread ID: " + Thread.currentThread().getId());
}
@Override
public void onComplete()
{
System.out.println("onComplete() called on thread ID: " + Thread.currentThread().getId());
}
});
rotorBehaviour.onNext(1);
rotorBehaviour.onNext(2);
}
对线程ID:1执行测试
在线程ID:1上调用OnSubscribe()。
在线程id:13上调用了onnext()。
在线程id:13上调用了onnext()。
进程已完成,退出代码为0
同样,在所有示例中,我仍然使用
行为主体
对象发起一个事件,我只是偶然发现,这将提供所需的结果。
我担心的是我可能正在使用
可观察的
和
行为主体
以一种错误的方式,即在后台线程上调用订户,从而“碰巧”给出正确的结果。除非我在文档的某个地方遗漏了它,否则如何使用这些对象来获得所需的结果似乎并不明显。