使用 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
- 它的水平太低了,太多人会在前两到三次时弄错;一直不明白为什么教程以此开头...
我需要在启动时解析几个 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
- 它的水平太低了,太多人会在前两到三次时弄错;一直不明白为什么教程以此开头...