背景线程上更新的RealMobject没有获得更新或通知



我有一个模型 extend realmObject 。在我的活动中,我将其设置为OnAddchangelistener,如下所示:

private RealmChangeListener<RealmResults<Member>> memberTracker = this::setupProfileUI;
private Member member;
private void setupProfileUI(RealmResults<MemberDetails> results) {
    member = results.first(null);
    updateProfileUI();
}

和在ongreate((中,我做

    RealmResults<Member> memberResults = realm.where(Member.class).findAll();
    memberResults.addChangeListener(memberTracker);
    member = memberResults.first(null);

i根据选择旋转器的选择,在背景线程上更新成员对象

    spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
            Request.updateMember(new Request.Callback<Member>() {
                        @Override
                        public void onResponse(Response<Member> response) {
                            Log.d(TAG, "updateMember: " + member.getLocation().getCity());
                            Log.d(TAG, "updateMember: " + response.body().getLocation().getCity());
                        }
                        @Override
                        public void onFailure(Throwable t) {
                            Log.e(TAG, "onFailure: Member Update Failed");
                        }
                    });
        }
        @Override
        public void onNothingSelected(AdapterView<?> adapterView) {
        }
    });

OnResponse回调中的第二个日志语句从API的响应中响应成员的城市,而第一次从成员的当前值打印了城市价值。后期值保持不变,活动没有收到更新通知。

会员通过呼叫呼叫helper函数在request.updatemember((中更新如下

private static void updateMemberDetails(Response<Member> response) {
    if (response.isSuccessful()) {
        try(Realm realmInstance = Realm.getDefaultInstance()) {
            Member member = response.body();
            if (member != null) {
                realmInstance.executeTransaction(realm -> realm.insertOrUpdate(member));
            }
        }
    }
}

我在.REALM文件中确实更新了该构件的成功async呼叫中的.REALM文件,但活动中的成员对象没有更新,也没有任何更新通知。

RealmResults<Member> memberResults = realm.where(Member.class).findAll();

根据Realmresults.addchangelistener的文档:

注册变更的听众不会阻止基础领域被收集。如果领域是垃圾收集的,则更改侦听器将停止触发。为了避免这种情况,请在适当的时间内保持有力的参考,例如在类变量中。

 public class MyActivity extends AppCompatActivity {
   private RealmResults<Person> results; // Strong reference to keep listeners alive
   @Override
   protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     results = realm.where(Person.class).findAllAsync();
     results.addChangeListener(new RealmChangeListener<RealmResults<Person>>() {
         @Override
         public void onChange(RealmResults<Person> persons) {
             // React to change
         }
     });
   }
 }

因此,您应该做到这一点。

最新更新