2016-05-28 14 views
1

最近、私はRxJavaを学んでいます。 zeroにカウントすると、CountDownLatchは停止します。さて、以下のコードを実行すると、CountDownLaychは決して止まらない!そして、私はJavaプロジェクトと同じコードを実行しようとしました。停止するのは大丈夫です! Androidのメーカーで RxJava:CountDownLatch never stop

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    final CountDownLatch latch = new CountDownLatch(5); 
    Observable 
      .interval(1, TimeUnit.SECONDS) 
      .subscribe(new Action1<Long>() { 
       @Override 
       public void call(Long counter) { 
        latch.countDown(); 
        long count = latch.getCount(); 
        Log.d(TAG, "call get -> " + counter + ", latch count -> " + count); 
       } 
      }); 

    try { 
     latch.await(); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 

、出力のようになりますこれらのコード:

D/MainActivity: call get -> 0, latch count -> 4 
D/MainActivity: call get -> 1, latch count -> 3 
D/MainActivity: call get -> 2, latch count -> 2 
D/MainActivity: call get -> 3, latch count -> 1 
D/MainActivity: call get -> 4, latch count -> 0 
D/MainActivity: call get -> 5, latch count -> 0 
D/MainActivity: call get -> 6, latch count -> 0 
D/MainActivity: call get -> 7, latch count -> 0 
.... 

答えて

2

the documentationによると、ラッチがゼロでカウントを停止しません。代わりに:

現在のカウントがゼロの場合、何も起こりません。

はこのようにあなたtryブロックを変更してみてください。

Log.d(TAG, "call await"); 
latch.await(); 
Log.d(TAG, "released"); 

私は、あなたがあなたのラッチがゼロになると、スレッドが解放されたことがわかります確信しています。それが起こったときにあなたの観測を放つのを止めたいなら、あなたはその観測からの脱退をしなければならないでしょう。

+0

正解 –