2017-03-09 37 views
1

在我的Android应用我用Rxjava2,但有些奇怪的形势出现了。Observable.create()subscribeOn和observeOn不工作

在我Disposable我打印记录当前线程的名称:

//1 
    Observable 
      .create((ObservableOnSubscribe<UserModel>) e -> { 
       //mock io 
       if (phoneNumber.equals("HolyHigh") && password.equals("111111")) { 
        e.onNext(new UserModel()); 
        e.onComplete(); 
       } else { 
        e.onError(new RuntimeException("Error.")); 
       } 
      }) 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .delay(1, TimeUnit.SECONDS) 
      .subscribe(
        r -> { 
         view.onLoginSuccess(new UserModel()); 
         //test 
         String name = Thread.currentThread().getName(); 
         Log.e("Thread Name", " Success Current Thread Name: " + name); 
        } 
        , e -> { 
         e.printStackTrace(); 
         view.onLoginFailed(e.getMessage()); 
         //test 
         String name = Thread.currentThread().getName(); 
         Log.e("Thread Name", " Error Current Thread Name: " + name); 
        } 
      ); 

然后登录:

Thread Name: Error Current Thread Name: RxComputationThreadPool-3

它看起来像observeOn和subscribeOn不工作... 为什么不主线程?

不过,我写了一些简单的...

//2 
    Single.timer(1, TimeUnit.SECONDS) 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(r -> { 
       Log.e("Single Thread Name", "Single Thread Name: " + Thread.currentThread().getName()); 
       CommonUtil.showToast(r + "~"); 
      }); 

这个记录:

Single Thread Name: Single Thread Name: main

哪里是我的错......

回答

0

delay()操作默认操作?在计算调度器上,所以它改变了上游事件以获得在计算线程上的通知。

您只需在订阅之前更改它,只需在delay()操作员之后移动observeOn .observeOn(AndroidSchedulers.mainThread())即可。

BTW,delay()还具有重载,获取Scheduler PARAM,让您更改默认Scheduler

+0

是的!解释很清楚。我在'''delay()''后面移动'observeOn(AndroidSchedulers.mainThread())'',它工作!谢谢〜 – twisty