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

时间:2016-02-23 10:33:13

标签: android multithreading 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());

因此,您可以看到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());

                    }
                }); 

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

实际上Rxjava如何处理这个线程更改?并且它证明了调用方法中的订阅者不是在subscribe()方法中使用的那个?

1 个答案:

答案 0 :(得分:4)

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

在您的代码中,您有两个主题更改:

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

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