2016-01-31 26 views
1

我想在鏈接請求上更新UI 2次。如何使用Rx更新鏈接請求上的UI Java

完成請求getUserByID()後首次更新UI。第二個getParentName()完成,但是當我嘗試更新第一個請求的UI並獲得線程問題的錯誤原因時。

我不知道如何解決這個問題。

示例代碼

API.getUserByID("USER ID") 
     .flatMap(user-> { 
      // How to update UI here? 
      return API.getParentName(user.getId())) 
     }) 
     .subscribeOn(Schedulers.io()) 
     .observeOn(AndroidSchedulers.mainThread()) 
     .subscribe(parent-> { 
      // It's ok to update UI cause of on main thread. 
      parentTextView.setText(parent.getName()) 
     }); 

謝謝。

回答

4

您希望更新可觀察發射的UI,因此您需要爲該可觀察值指定觀察者線程。
那麼你應該使用doOnNext操作,即在觀察者線程調用:

API.getUserByID("USER ID") 
     .subscribeOn(Schedulers.io()) 
     .observeOn(AndroidSchedulers.mainThread()) 
     .doOnNext(user_ -> {calls on observer thread}) 
     .flatMap(user-> { 
      return API.getParentName(user.getId())) 
       .subscribeOn(Schedulers.io()) 
       .observeOn(AndroidSchedulers.mainThread()) 
     }) 
     .subscribe(parent-> { 
      // It's ok to update UI cause of on main thread. 
      parentTextView.setText(parent.getName()) 
     }); 
+0

我可以更新的TextView上'doOnNext()',但它拋出錯誤 「StrictMode $ AndroidBlockGuardPolicy」 關於'訂閱()' –

+2

您是不是要找'NetworkOnMainThreadException'?嘗試apply.'subscribeOn(Schedulers.io()'到每個網絡observable,而不是'flatmap',我upd回答 – zella

+0

Thx,你救我的命:) –