我正在尝试在 Android 中使用 RxJava 实现异步任务。
我尝试了以下代码,但没有成功。它在 UI 线程上执行。我正在使用以下版本的 RxAndroid 0.24.0。
try {
Observable.just(someMethodWhichThrowsException())
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(s -> onMergeComplete());
}
catch (IOException e) {
e.printStackTrace();
}
但是,以下内容对我来说是异步工作的。
Observable observable = Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
try {
someMethodWhichThrowsException();
} catch (IOException e) {
e.printStackTrace();
}
subscriber.onCompleted();
}
});
observable.subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread()).subscribe();
我试图理解以下内容:
- 它们之间有什么区别?
- 创建异步任务时的最佳实践是什么?
- 它们之间有什么区别?
Observable.just(someMethodWhichThrowsException())
.subscribeOn(Schedulers.newThread())
这相当于以下内容:
Object someResult = someMethodWhichThrowsException();
Observable.just(someResult)
.subscribeOn(Schedulers.newThread())
正如您所看到的,这首先调用同步方法,then将其传递给Observable.just
成为一个可观察者。
Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
...
}
})
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe();
但是,此方法将运行call
block 订阅中。你已经告诉它你想订阅一个新线程(subscribeOn(Schedulers.newThread())
),因此订阅发生在一个新线程上,并且在订阅上运行的代码(call
block)也在该线程上运行。这与调用类似的行为Observable.defer.
- 创建异步任务时的最佳实践是什么?
好吧,这取决于您和您想要的行为。有时您希望异步代码立即开始运行(在这种情况下,您可能希望使用其中一个运算符来缓存它)。我肯定会考虑使用异步实用程序为此的图书馆。
其他时候,您会希望它仅在订阅上运行(这是此处示例中的行为) - 例如,如果存在副作用,或者如果您不关心它何时运行而只想使用内置的-ins 从 UI 线程中获取一些内容。丹·卢提到 that Observable.defer
在转换为 Rx 期间,非常方便地获取旧代码并将其从 UI 线程中取出。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)