我需要在启动时解析一些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的答案也是可以接受的。
答案 0 :(得分:1)
您的Observable构造不正确,您需要自己驱动异步过程:
Observable.create(new Observable.OnSubscribe<Object>() {
@Override
public void call(Subscriber<? super Object> subscriber) {
parseBundles();
parsePhrases();
subscriber.onCompleted();
}
})
顺便说一句,我讨厌Observable.create
- 它太低了,太多人会在前两三次出错;永远不明白为什么教程从那开始...