Android RxJava,非阻塞?

标签 android rx-java

我的理解是 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();

subscribeOnobserveOn 都返回一个新的 Observable 来实现它们的功能。但是原始的 Observable 并没有被修改。实际上,每个运算符(operator)总是会在不修改原始 Observable 的情况下创建一个新的 Observable。

关于Android RxJava,非阻塞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23447077/

相关文章:

android - SequenceInputStream 不合并音频文件

rx-java - 如何以线性方式连接两个可观察的操作(先做这件事,然后做第二件事)?

android - 如何在 MediaPlayer 应用程序中限制/去抖搜索栏搜索事件

java - "No Instance of type variable R exist so that Observable conforms to Observable"更新到 RxJava2 时出错

android - 如何从下到上制作底部工作表

android - Phonegap 指南针插件无法正常工作

java - Spring boot 1.5.6 中的 RxJava 2

java - 检查 RxJava 中是否有订阅者抛出异常

android - 安装 apk "Open"和 "Done"按钮显示后,单击打开按钮不会将类别添加为启动器

安卓编程 : Stay with CyanogenMod?