我有一个模型 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
}
});
}
}
因此,您应该做到这一点。