RealmChangeListener未被调用

3

我正在尝试将一个列表视图与一个 Realm 表格链接起来,因此当表格中添加一个项目时,列表视图应该被更新。问题在于,当添加项目时,RealmChangeListener 没有被调用。

Realm real = RealmController.getInstance(getContext()); // Singleton
RealmResults<Friend> friends = real.where(Friend.class).findAllAsync();
friends.addChangeListener(callback);

RealmChangeListener<RealmResults<Friend>> callback=new RealmChangeListener<RealmResults<Friend>>() {
    @Override
    public void onChange(RealmResults<Friend> element) {
        // This is only called on async completed but not later
    }
};

保存过程在Retrofit响应中完成:

    new MyService(context).userService().getFriends().enqueue(new Callback<FriendResponse>() {
        @Override
        public void onResponse(Call<FriendResponse> call, Response<FriendResponse> response) {
            Realm realm = RealmController.getInstance(context); // singleton
            realm.beginTransaction();
            realm.copyToRealmOrUpdate(response.body().friends);
            realm.commitTransaction();
        }

        @Override
        public void onFailure(Call<AllInfoResponse> call, Throwable t) {

        }
    });

你知道发生了什么吗?有什么建议吗?


2
如果您在UI线程上关闭了Realm,或者您的朋友的RealmResults被GC回收,那么changelistener将不会被调用。 - Christian Melchior
我不显式调用Close。事实上,单例模式有助于获取一个活动实例。所以我假设friends被垃圾回收了,我会尝试将其作为类属性。 - Daniel Argüelles
1
@ChristianMelchior,我将RealmResults<Friend> friends;设置为类属性,它能正常工作!如果您把它写成解决方案,我会将其标记为正确答案。 - Daniel Argüelles
1个回答

1

我在处理与你的情况类似的问题时遇到了一些困难(使用Retrofit调用,通过RealmChangeListener刷新UI),我本来想发布一个新问题,但我自己解决了这个问题。

在我的情况下,我将RealmChangeListener实现在我的ArrayAdapter中,我认为这样更清晰:

public class ListAdapter extends ArrayAdapter<Item> implements
        RealmChangeListener<RealmResults<Item>> {

    private final List<Item> items;

    public ListAdapter(Context context, RealmResults<Item> items) {
        super(context, R.layout.listitem_item);
        this.items = items;
        items.addChangeListener(this);
    }

    @Override
    public void onChange(RealmResults<Restaurant> element) {
        notifyDataSetChanged();
    }

    ...
}

在另一种情况下,我正在活动的onCreate中初始化视图并调用我的Retrofit服务,但某种方式监听器在接收响应之前未被附加。因此,我做的另一件事是在onPostCreate方法中调用Retrofit,确保监听器已准备就绪。
public class ItemListActivity BaseActivity implements
        RealmChangeListener<RealmResults<Item>>,
        Callback<GetItemsResponse> {

    private long id;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_item_list);

        RealmResults<Item> items = getRealm()
                .where(Item.class)
                .findAll();

        items.addChangeListener(this);

        setupUI(items);
    }

    @Override
    protected void onPostCreate(@Nullable Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);

        MyRetrofitClient
                .getInstance(this)
                .getItems()
                .enqueue(this);
    }

    @Override
    public void onResponse(Call<GetItemsResponse> call, final Response<GetItemsResponse> response) {
        getRealm().executeTransaction(new Realm.Transaction() {
            @Override
            public void execute(Realm realm) {
                List<Item> newItems = response.body().getNewItems();
                realm.copyToRealmOrUpdate(newItems);
            }
        });
    }

    @Override
    public void onChange(RealmResults<Item> items) {
        updateUI();
    }

    ...
}

希望这些内容中的任何一点都能有所帮助!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接