有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java将RealmObjectChangeListener添加到异步下载的RealmObject

假设一个异步API调用返回的成员数据是RealmObject,并且成员被保存到realm

public class Member extends RealmObject { 
    String name;
}

现在我想将RealmObjectChangeListener添加到一个成员对象(比如,Member),以便在数据可用时更新UI。但是,首先,成员表为空,成员为null,因为获取成员数据的API调用是异步的。将RealmObjectChangeListener添加到成员将导致NullPointerException。如何处理这种情况


共 (1) 个答案

  1. # 1 楼答案

    如果您正在侦听所有成员,那么很容易:保留对成员的字段引用(在RecyclerView的ViewHolder中很容易),并将RealmObjectChangeListener添加到从results.get()获得的成员,绑定到ViewHolder

    void bind(Member member) {
        if(this.member != null) {
            this.member.removeAllChangeListeners();
        }
        this.member = member;
        this.member.addChangeListener(...);
    

    假设您正在等待一个特定的member和一个特定的name,并且您只关心该成员:

    private final Handler handler = new Handler(Looper.getMainLooper());
    
    private RealmResults<Member> objectResults;
    private RealmChangeListener<RealmResults<Member>> objectTracker = (results) -> {
        if(member != null && member.isValid()) {
            return;
        }
        if(realm.isInTransaction()) {
            handler.post(() -> {
                setupMember(results);
            });
        } else {
            setupMember(results);
        }
    };
    
    private void setupMember(RealmResults<Member> members) {
        if(member != null && member.isValid()) {
            member.removeAllChangeListeners();
        }
        member = members.first(null);
        if(member != null) {
            member.addChangeListener((member, fieldChangeSet) -> {
                // do whatever
            }); 
        }
    }
    
    private Member member;
    
    private Realm realm;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(...);
        realm = Realm.getDefaultInstance();
        objectResults = realm.where(Member.class).equalTo("name", name).findAllAsync();
        objectResults.addChangeListener(objectTracker);
    }
    
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if(member != null) {
            member.removeAllChangeListeners();
        }
        objectResults.removeAllChangeListeners();
        realm.close();
    }
    

    编辑:如果不需要更改字段级别:

    private RealmResults<Member> objectResults;
    private RealmChangeListener<RealmResults<Member>> objectTracker = (results) -> {
        setupMember(results);
    };
    
    private void setupMember(RealmResults<Member> members) {
        Member member = members.first(null);
        if(member != null) {
            updateViews(member); // update views with member
        } else {
            // member doesn't exist or was deleted
        }
    }
    
    private Realm realm;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(...);
        realm = Realm.getDefaultInstance();
        objectResults = realm.where(Member.class).equalTo("name", name).findAllAsync();
        objectResults.addChangeListener(objectTracker);
    }
    
    @Override
    protected void onDestroy() {
        super.onDestroy();
        objectResults.removeAllChangeListeners();
        realm.close();
    }