android - 在 onClick 之后正确更新 RealmModel,而不阻塞 Android 中的 UI

标签 android android-recyclerview realm realm-list

我有一个 RecyclerView,它显示 Realm 数据库中的项目。 为此,我基于 realm-android-adapters 实现了 RealmRecyclerViewAdapter它获取传入的 OrderedRealmCollection 。 为此,我使用 findAllAsync()

加载数据
realm.where(Entry.class).findAllAsync()

当用户滚动列表时,他可以选择“收藏”某些条目,我在“收藏”按钮上使用普通的 OnClickListener 实现了这一点。

现在,每当用户单击按钮时,我都希望更新条目的“最喜欢的” bool 值。用户单击后,按钮上会显示一个小动画。

为此,我尝试了以下方法,遗憾的是给出了错误的线程异常:

realm.executeTransactionAsync(new Realm.Transaction() {
    @Override
    public void execute(Realm realm) {
        entry.setLiked(!entry.isLiked());
    }
});

作为替代方案,我尝试使用正常的 executeTransaction ,它可以工作,但会阻止显示动画。

realm.executeTransaction(new Realm.Transaction() {
    @Override
    public void execute(Realm realm) {
        entry.setLiked(!entry.isLiked());
    }
});

作为一个有趣的补充,这给出了以下日志:

Mixing asynchronous queries with local writes should be avoided. Realm will convert any async queries to synchronous in order to remain consistent. Use asynchronous writes instead.

是否有可能完全异步更新项目而不引入延迟或阻止动画显示?

最佳答案

RealmRecyclerViewAdapter 在 Realm 自动更新时调用 adapter.notifyDataSetChanged(),因此不会调用布局动画。

至于实际进行更改,

public class EntryViewHolder extends RecyclerView.ViewHolder {
    @BindView(R.id.entry_favorite)
    Button favButton;

    public EntryViewHolder(View view) {
        super(view);
        ButterKnife.bind(this, view);
    }

    public void bind(Entry entry) {
        final long entryId = entry.getId();
        favButton.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View view) {
                 realm.executeTransactionAsync(new Realm.Transaction() {
                     @Override
                     public void execute(Realm realm) {
                         Entry entry = realm.where(Entry.class)
                                            .equalTo("id", id)
                                            .findFirst();
                         if(entry != null) {
                             entry.deleteFromRealm();
                         }
                     }
                 });
             }
        });
    }
}

关于android - 在 onClick 之后正确更新 RealmModel,而不阻塞 Android 中的 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38904951/

相关文章:

android - 单击按钮时更新 recyclerview

mvvm - Realm 和 react 性 cocoa

android - 在Android中将纵向和横向设置在一个地方

android - 应用程序在后台运行超过 10 分钟后 Websocket 关闭。 ( native react )

android - 在 fragment 上设置LayoutManager

ios - 致力于开发库存应用程序。我正在尝试在 Realm 中保存多个对象

java - 合并多个 RealmList 并对结果列表进行排序?

java - 匿名 Runnable 的这种特殊使用会导致内存泄漏吗?

Android 如何在不扩展 listActivity 的情况下为 listView 使用适配器

android - Recyclerview 中的多个编辑文本