2016-05-28 4 views
1

Недавно я изучаю RxJava. Мы все знаем, что CountDownLatch остановится при подсчете до zero. Ну, но когда я запускаю код ниже, CountDownLaych никогда не останавливайтесь! И я пытаюсь запустить тот же код, что и проект Java, это нормально, чтобы остановить!RxJava: CountDownLatch никогда не останавливается

@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(); 
    } 
} 

В Android Studio, Это код будет выводить как:

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

Это правильный ответ –