gpt4 book ai didi

android - 订阅者的 onNext() 方法在哪个线程上运行?

转载 作者:行者123 更新时间:2023-11-29 15:44:04 25 4
gpt4 key购买 nike

我有一个创建新 Observable 的用例:

Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
final RequestFuture<String> futureRequest = RequestFuture.newFuture();
try{
//getResult() is a sync time consuming http connection
String response = getResult();
subscriber.onNext( response );
subscriber.onCompleted();
Log.e("call method","Thread is about to end" + Thread.currentThread().getId());
}
catch ( Exception e){
subscriber.onError( e );
}

}
}).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread());

正如您所看到的,getResult() 方法是一个耗时的 http 调用,我以同步方式进行。我在 io 线程上订阅它并在 Android 的主线程上观察。

当我检索可观察对象并订阅它时:

subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
Log.e("on completed method", "Thread is ending "+ Thread.currentThread().getId());

}

@Override
public void onError(Throwable e) {
Toast.makeText( getContext(), "failed!",Toast.LENGTH_LONG ).show();
}

@Override
public void onNext(String s) {
Log.e("on Next method", "Thread is about to end" + Thread.currentThread().getId());

}
});

奇怪的是,我可以看到 call() 方法在其 ID 为 372 的线程上运行,订阅者的 onNext() 方法在线程 1 上运行,我认为它是来自 android 的 UiThread。

那么实际上 Rxjava 是如何处理这个线程变化的呢?并证明 call 方法中的订阅者不是我在 subscribe() 方法中使用的订阅者?

最佳答案

默认情况下,订阅者的 onNext 将在您调用 .subscribe 的同一线程上运行。

但是在您的代码中有两个线程更改:

第一个是 subscribeOn(IO),它将运行 .create 和 IO 链的其余部分。之后,您有 observeOn(mainThread),这会将以下所有操作更改为 mainThread,包括 .subscribe() 中的 final方法。

希望这能让您更好地理解这两个运算符的工作原理:https://medium.com/@diolor/observe-in-the-correct-thread-1939bb9bb9d2#.t6uagyarn

关于android - 订阅者的 onNext() 方法在哪个线程上运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35575040/

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