使用 RxJava 在主线程外解析 JSON

Parsing JSON off the main thread using RxJava

我需要在启动时解析几个 JSON 文件并用它们的数据填充数据库。在应用程序启动时,会在解析文件时显示初始屏幕。

我想在主线程中执行所有解析,并让加载动画顺利进行。

我已经能够使用 RxJava 的 Observable.create() 方法创建一个 Observable。当前代码如下:

Observable.create(new Observable.OnSubscribe<Object>() {
    @Override
    public void call(Subscriber<? super Object> subscriber) {
        parseBundles();
        parsePhrases();
    }
})
.subscribeOn(Schedulers.io())
.subscribe(new Subscriber<Object>() {
    @Override
    public void onCompleted() {
        startActivity(new Intent(SplashActivity.this, HomeActivity.class),
            ActivityOptionsCompat.makeCustomAnimation(SplashActivity.this,
            android.R.anim.fade_in, android.R.anim.fade_out).toBundle());
    }

    @Override
    public void onError(Throwable e) {
        e.printStackTrace();
    }

    @Override
    public void onNext(Object o) {

    }
});

这在 io 线程上成功地使 parseBundles()parsePhrases() 方法 运行。对于某些上下文,这两种方法只是使用 InputStream 加载本地 .json 文件并将 .json 放入 String 变量中,其中相关的 JSONObjects 是然后拔出来,并将数据保存到DB中。

然而,问题是 onCompleted() 从未被调用过。 parseBundles()parsePhrases() 方法都是普通的旧方法,没有任何 Rx 代码。据我了解,我需要修改它们以在完成时正确地发出一些东西。

如何修改此代码以使其按描述工作?请注意,这是目前使用 RxJava 1 编写的,但是使用 RxJava 2 的答案也是可以接受的。

您的 Observable 构造不当,您需要自己驱动异步进程:

Observable.create(new Observable.OnSubscribe<Object>() {
  @Override
  public void call(Subscriber<? super Object> subscriber) {
    parseBundles();
    parsePhrases();
    subscriber.onCompleted();
  }
})

顺便说一句,我讨厌 Observable.create - 它的水平太低了,太多人会在前两到三次时弄错;一直不明白为什么教程以此开头...