2016-04-28 5 views
0

私はスレッドの代わりにRxAndroidを使用しています。 そして私はioスレッドでそれを購読しましたが、メインスレッドで実行されることがありました。 ログがメインスレッドで印刷されることがありました。 logcatでなぜmainthreadでSchedulers.io()が動作するのですか?

Observable.from(bitmaps.toArray(new Bitmap[0])) 
      .subscribeOn(Schedulers.io()) 
      .observeOn(Schedulers.io()) 
      .zipWith(Observable.range(0, bitmaps.size()), new Func2<Bitmap, Integer, Boolean>() { 
       @Override 
       public Boolean call(Bitmap bitmap, Integer i) { 
        Log.i("==", "" + i); 
        return true; 
       } 
      }) 
      .last() 
      .subscribe(new Action1<Boolean>() { 
       @Override 
       public void call(Boolean aBoolean) { 
       } 
      }); 

2スレッド:

04-28 14:33:14.696 7215-23795/ Thread: RxCachedThreadScheduler-1 
04-28 14:33:19.811 7215-7215/ Thread: main 

ソリューション: 私はzipWith(後subscribeOn()を移動します)、それは[OK]を実行します。

Observable.from(bitmaps.toArray(new Bitmap[0])) 
     .zipWith(Observable.range(0, bitmaps.size()), new Func2<Bitmap, Integer, Boolean>() { 
      @Override 
      public Boolean call(Bitmap bitmap, Integer i) { 
       Log.i("==", "" + i); 
       return true; 
      } 
     }).subscribeOn(Schedulers.io()) 
     .last() 
     .subscribe(new Action1<Boolean>() { 
      @Override 
      public void call(Boolean aBoolean) { 
      } 
     }); 

答えて

0

を運ぶ-where。

常にこの親指のルールを覚えて、

subscribeOn()は、常にそれに上流事業者に影響を与え、observerOn() はいつもそれに下流事業者に影響を与えます。

あなたはzip()の下subscribeOn()を移動するので、それはSchedulers.io()の上流実行します。

メインスレッドで結果を観察し、必要に応じてUIを変更するには、observeOn()も使用する必要があります。

+0

ええ、あなたは正しいです! – 0Kai

0

.subscribeOn - .observeOnに答える取るはい、これは正常な動作です

.subscribeOn(AndroidSchedulers.mainThread()) 
+0

zipWithの後にsubscribeOnを移動すると、okが実行されます。 – 0Kai

+0

@ 0Kaiとremoowe。observeOn? – PeDuCKA

+0

それはioスレッドでのみ実行されるので、削除します。 – 0Kai

関連する問題