Android领域使用RxJava异步更新

时间:2016-09-13 03:39:09

标签: android asynchronous realm rx-java

我有这个查询来更新我的领域表中的数据;

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. 订阅中的Action1返回RealmObject而不是PlayerObject
  2. 如何从这里开始
  3. 对此有任何指导意见。

    由于

    更新

            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();
    
        }
    

2 个答案:

答案 0 :(得分: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方法。

答案 1 :(得分: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 s无法观察到非looper后台线程。)

您还应该取消订阅您在必要时创建的任何订阅。

是的,要在RealmPlayer中获取asObservable(),请使用.<RealmPlayer>asObservable()

简而言之,您应该将该逻辑放在后台线程上,并监听UI线程上的更改。后台线程逻辑必须使用同步API完成。您不需要findFirstAsync