我的理解是 rxjava-android 在单独的线程上执行操作(当提供正确的调度程序时),从而导致非阻塞操作,但是快速而肮脏的测试似乎证明这是不正确的。
我使用了以下代码 fragment ,在这两种情况下,UI 都被阻止了......
fragment 1
Observable observable = Observable.create(new Observable.OnSubscribe<Object>() {
@Override
public void call(Subscriber<? super Object> subscriber) {
int i = 0;
while (i == 0) {}
subscriber.onCompleted();
}
});
observable.subscribeOn(Schedulers.newThread());
observable.observeOn(AndroidSchedulers.mainThread());
observable.subscribe();
fragment 2
Observable observable = Observable.create(new Observable.OnSubscribe<Object>() {
@Override
public void call(Subscriber<? super Object> subscriber) {
SystemClock.sleep(5000);
subscriber.onCompleted();
}
});
observable.subscribeOn(Schedulers.newThread());
observable.observeOn(AndroidSchedulers.mainThread());
observable.subscribe();
我是不是漏掉了什么?
最佳答案
错误是你使用了错误的Observable
。正确的代码应该是:
Observable observable = Observable.create(new Observable.OnSubscribe<Object>() {
@Override
public void call(Subscriber<? super Object> subscriber) {
int i = 0;
while (i == 0) {}
subscriber.onCompleted();
}
});
observable.subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread()).subscribe();
subscribeOn
和observeOn
都返回一个新的 Observable 来实现它们的功能。但是原始的 Observable 并没有被修改。实际上,每个运算符(operator)总是会在不修改原始 Observable 的情况下创建一个新的 Observable。
关于Android RxJava,非阻塞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23447077/