执行Realm database操作时提示UI线程运行事务被禁用该如何解决
Realm UI线程事务报错解决方案
已禁用在UI线程上运行事务,可通过设置
RealmConfiguration.Builder.allowWritesOnUiThread(true)启用该权限。
方案1:官方推荐方案,将事务放到子线程执行(避免UI卡顿、ANR风险)
- 可直接调用Realm封装好的异步事务API,无需手动切换线程,示例代码如下:
// Kotlin示例 realm.executeTransactionAsync { bgRealm -> // 在此处执行所有增删改事务操作 val user = bgRealm.where(User::class.java).equalTo("id", 1).findFirst() user?.name = "修改后的名称" }
- 若事务执行完成后需要更新UI,可添加成功/失败回调处理:
realm.executeTransactionAsync( { bgRealm -> /* 执行事务逻辑 */ }, { /* 事务执行成功,回调运行在UI线程,可直接更新界面 */ }, { error -> /* 事务执行失败,异常处理逻辑 */ } )
Java版本示例:
// Java示例 realm.executeTransactionAsync(new Realm.Transaction() { @Override public void execute(Realm bgRealm) { User user = bgRealm.where(User.class).equalTo("id", 1).findFirst(); if (user != null) { user.setName("修改后的名称"); } } }, new Realm.Transaction.OnSuccess() { @Override public void onSuccess() { // 事务成功,更新UI } }, new Realm.Transaction.OnError() { @Override public void onError(Throwable error) { // 事务失败处理 } });
方案2:临时快捷方案,开启UI线程写权限(仅适合极小数据量操作,不推荐长期使用)
在初始化Realm全局配置时添加allowWritesOnUiThread(true)配置即可:
// Kotlin配置示例 val config = RealmConfiguration.Builder() .name("myrealm.realm") .allowWritesOnUiThread(true) // 添加该行配置 .build() Realm.setDefaultConfiguration(config)
// Java配置示例 RealmConfiguration config = new RealmConfiguration.Builder() .name("myrealm.realm") .allowWritesOnUiThread(true) // 添加该行配置 .build(); Realm.setDefaultConfiguration(config);
内容的提问来源于stack exchange,提问作者Javad Mirzaiee
相关产品推荐
相关产品推荐

