2016-09-13 58 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