gpt4 book ai didi

android - Android 中的 RxJava 异步任务

转载 作者:可可西里 更新时间:2023-11-01 18:54:23 38 4
gpt4 key购买 nike

我正在尝试在 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();

我正在尝试理解以下内容:

  1. 它们有什么区别?
  2. 创建异步任务时的最佳做法是什么?

最佳答案

  1. 它们之间有什么区别?
Observable.just(someMethodWhichThrowsException())
.subscribeOn(Schedulers.newThread())

这等同于:

Object someResult = someMethodWhichThrowsException();
Observable.just(someResult)
.subscribeOn(Schedulers.newThread())

如您所见,这会首先调用同步方法,然后将其传递给 Observable.just 以成为 Observable。

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 的行为。 .

  1. 创建异步任务时的最佳做法是什么?

好吧,这取决于您和您想要的行为。有时您希望异步代码立即开始运行(在这种情况下,您可能希望为此目的使用其中一个运算符对其进行缓存)。我肯定会考虑使用 Async Utils图书馆。

其他时候,您可能希望它仅在订阅时运行(这是此处示例中的行为)——例如,如果有副作用,或者您不关心它何时运行而只想使用内置插件从 UI 线程中获取一些东西。 Dan Lew mentions Observable.defer 在转换为 Rx 期间非常方便地提取旧代码并将其从 UI 线程中取出。

关于android - Android 中的 RxJava 异步任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29670452/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com