使用RxJava从主线程解析JSON

时间:2017-06-08 16:37:24

标签: android rx-java rx-java2

我需要在启动时解析一些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) {

    }
});

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

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

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

1 个答案:

答案 0 :(得分:1)

您的Observable构造不正确,您需要自己驱动异步过程:

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

顺便说一句,我讨厌Observable.create - 它太低了,太多人会在前两三次出错;永远不明白为什么教程从那开始...