2016-11-10 38 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()方法在UI线程做。 我做错了什么?

回答

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()'并重新订阅'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 

如果您的代码在UI线程然后getSleep()将在UI线程中执行运行。您必须推迟电话(例如使用fromCallable)。

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

我试图做类似秒表。'fromCallable'没有根据需要纠正情况( –