2016-11-10 2 views
2

Как использовать RxJava обновление UI каждую секунду в Android? Я пытаюсь сделать что-то вроде этого:RxJava Thread.sleep в другой теме

for (int i = 0; i <10 ; i++) { //test 
       rx.Observable.just(getSleep()) 
         .subscribeOn(Schedulers.newThread()) 
         .observeOn(AndroidSchedulers.mainThread()) 
         .subscribe(v->updateTime());//update textView 
     } 

    private <T> int getSleep() { 
     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     return 0; 
    } 

Но Thread.sleep() делаю в потоке пользовательского интерфейса. Что я должен делать неправильно?

ответ

2
Observable.interval(1, TimeUnit.SECONDS) //emits item every second 
      .observeOn(AndroidSchedulers.mainThread()) //switches thread from computation (interval's default) to UI 
      .subscribe(i -> updateUI()); //update your textView 
+0

не забывайте подписывать это' onPause() 'и resubscribe' onResume() ' –

1
rx.Observable.just(getSleep()) 
        .subscribeOn(Schedulers.newThread()) 
        .observeOn(AndroidSchedulers.mainThread()) 
        .subscribe(v->updateTime());//update textView 

это как

int stuff = getSleep(); 
rx.Observable.just(stuff) 
        .subscribeOn(Schedulers.newThread()) 
        .observeOn(AndroidSchedulers.mainThread()) 
        .subscribe(v->updateTime());//update textView 

Если ваш код выполняется в потоке пользовательского интерфейса, то getSleep() будет выполняться в UI Thread. Вам придется отложить свой вызов (например, с помощью fromCallable).

 rx.Observable.fromCallable(() -> getSleep()) 
        .subscribeOn(Schedulers.newThread()) 
        .observeOn(AndroidSchedulers.mainThread()) 
        .subscribe(v->updateTime());//update textView 
+0

Я пытаюсь сделать что-то вроде секундомера. 'fromCallable' не исправил ситуацию по мере необходимости ( –

Смежные вопросы