Qin*_*ing 2 multithreading android rx-java rx-android
我有一个创建新 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());
Run Code Online (Sandbox Code Playgroud)
因此,正如您所看到的,getResult() 方法是一个 http 调用,它很耗时,而且我是以同步方式进行的。我在 io 线程上订阅它并在 Android 的主线程上观察。
当我检索 observable 并订阅它时:
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());
}
});
Run Code Online (Sandbox Code Playgroud)
奇怪的是我可以看到 call() 方法正在一个线程上运行,它的 id 是 372,而订阅者的 onNext() 方法正在线程 1 上运行,我认为它是来自 android 的 UiThread。
那么实际上 Rxjava 是如何处理这个线程变化的呢?它证明 call 方法中的订阅者不是我在 subscribe() 方法中使用的那个?
默认情况下,订阅者的 onNext 将在您调用.subscribe.
但是,在您的代码中,您有两个线程更改:
第一个是subscribeOn(IO)将.create在 IO 中运行链的其余部分。之后,您observeOn(mainThread)将把以下所有操作都更改为 mainThread,包括.subscribe().
希望这能让您更好地了解这两个运算符的工作原理:https : //medium.com/@diolor/observe-in-the-correct-thread-1939bb9bb9d2#.t6uagyarn
| 归档时间: |
|
| 查看次数: |
2863 次 |
| 最近记录: |