2016-09-13 99 views
0

我有這個查詢來更新已經在我的領域表中的數據;使用RxJava異步Android界面更新

for (MyGameEntrySquad squad : response.body().getSquad()) { 
      subscription = realm.where(RealmPlayer.class).equalTo("id", squad.getPlayer().getId()) 
        .findFirstAsync() 
        .asObservable() 
        .subscribe(new Action1<RealmObject>() { 
         @Override 
         public void call(RealmObject realmObject) { 

         } 
        }); 

} 

我想異步執行此查詢,然後在UI上顯示結果。

基本上,response.body()。getSquad()有一個id與已經在DB中的記錄相匹配;這就是我在equalTo方法中使用的內容。

根據收到的數據,我想更新每個匹配ID的記錄的兩列。

不過,我對這個面臨着一些挑戰:

  1. 的措施1在訂閱的,而不是返回RealmObject一個PlayerObject的
  2. 如何從這裏

上的任何指導進行這將不勝感激。

感謝

更新

 if (response.isSuccessful()) { 
     //asynchronously update the existing players records with my squad i.e is_selected 
     for (MyGameEntrySquad squad : response.body().getSquad()) { 

      realm.where(RealmPlayer.class).equalTo("id", squad.getPlayer().getId()) 
        .findFirstAsync() 
        .<RealmPlayer>asObservable() 
        .filter(realmPlayer -> realmPlayer.isLoaded()) 
        .subscribe(player -> { 
         realm.beginTransaction(); 
         if (squad.getPlayer().getPosition().equals("GK")) { 
          player.setPlaygroundPosition("gk"); 
          player.setIsSelected(true); 
         } 

         // pick the flex player 
         if (squad.isFlex()) { 
          player.setPlaygroundPosition("flex"); 
          player.setIsSelected(true); 
         } 

         // pick the Goalie 
         if (squad.getPlayer().getPosition().equals("GK")) { 
          player.setPlaygroundPosition("gk"); 
          player.setIsSelected(true); 
         } 

         // pick the DFs 
         if ((squad.getPlayer().getPosition().equals("DF")) && (!squad.isFlex())) { 
          int dfCounter = 1; 
          player.setPlaygroundPosition(String.format(Locale.ENGLISH, "df%d", dfCounter)); 
          player.setIsSelected(true); 
          dfCounter++; 
         } 

         // pick the MFs 
         if ((squad.getPlayer().getPosition().equals("MF")) && (!squad.isFlex())) { 
          int mfCounter = 1; 
          player.setPlaygroundPosition(String.format(Locale.ENGLISH, "mf%d", mfCounter)); 
          player.setIsSelected(true); 
          mfCounter++; 
         } 

         // pick the FWs 
         if ((squad.getPlayer().getPosition().equals("FW")) && (!squad.isFlex())) { 
          int fwCounter = 1; 
          player.setPlaygroundPosition(String.format(Locale.ENGLISH, "mf%d", fwCounter)); 
          player.setIsSelected(true); 
          fwCounter++; 
         } 

         realm.copyToRealmOrUpdate(player); 
         realm.commitTransaction(); 
         updateFieldPlayers(); 


        }); 

     } 

     hideProgressBar(); 

    } 
+0

那麼你什麼時候取消訂閱你的用戶?你**做**取消訂閱,對吧?你在哪裏「更新兩列」?你如何顯示對象(是一個RecyclerView或其他東西)?這個示例代碼運行在哪個線程上?目前沒有足夠的數據可以正確回答這個問題。 – EpicPandaForce

+0

嗨@EpicPandaForce,我面臨的挑戰之一就是從那一點開始,這就是爲什麼有些信息丟失的原因。我在編輯原始問題以顯示目前在哪裏 –

+0

@EpicPandaForce是我退訂;在onDestroy()函數中。我現在使用TableLayout –

回答

0
realm.where(RealmPlayer.class).equalTo("id", squad.getPlayer().getId()) 
         .findFirstAsync() 
         .<RealmPlayer>asObservable() 
         .subscribe(new Action1<RealmPlayer>() { 
          @Override 
          public void call(RealmPlayer player) { 

          } 
         }); 

你應該做的那樣。

順便說一句,在一個循環中執行它是個壞主意 - 檢查RealmQuery的方法in

+0

Hi @Divers, 感謝您的回答。 但是我不明白最後一點。 來自** response.body()。getSquad()**的數據來自正在使用的HTTP請求,用於更新已經存在的數據 –

+0

不要進行大量的領域查詢,而是獲取'班的名單。 getPlayer()。getId()'並使用'in'領域查詢來獲取一個查詢中的數據。如果您的問題得到解答,請將其標記爲正確答案。 – Divers

0
for (MyGameEntrySquad squad : response.body().getSquad()) { // btw why is this not `Observable.from()`? 
     subscription = realm.where(RealmPlayer.class).equalTo("id", squad.getPlayer().getId()) 
       .findFirstAsync() 
       .asObservable() 

這不應該在UI線程上。它應該在後臺線程上。在後臺線程上,您需要使用同步查詢而不是異步查詢。

即使在UI線程上,您仍然需要filter(RealmObject::isLoaded),因爲它是異步查詢,而在findFirstAsync()的情況下,您還需要篩選RealmObject::isValid

對於這種情況,您不需要asObservable() - this method is for observing a particular item and adding a RealmChangeListener to it。考慮到這應該在具有同步查詢的後臺線程上,這不是必需的(非循環後臺線程不能用RealmChangeListener來觀察)。

您還應該取消訂閱您在必要時創建的任何訂閱。

是的,要獲得RealmPlayerasObservable(),請使用.<RealmPlayer>asObservable()

總之,您應該將該邏輯放在後臺線程上,並監聽UI線程中的更改。後臺線程邏輯必須使用同步API完成。您不需要findFirstAsync