专栏首页Frank909java.lang.IllegalStateException: Realm access from incorrect thread. Realm objects can only be acce

java.lang.IllegalStateException: Realm access from incorrect thread. Realm objects can only be acce

java.lang.IllegalStateException: Realm access from incorrect thread. Realm objects can only be accessed on the thread they were created.

这两天碰到一个bug,因为自己的不小心。bug如下:

提示出错的代码是这一段:

mRealm.executeTransactionAsync(new Realm.Transaction() {
  @Override
   public void execute(Realm realm) {
       final RealmResults<Apple> realmResults = mRealm.where(Apple.class).findAll();

       for(Apple apple:realmResults){
           Log.d(TAG, "query "+apple.toString());
       }
   }
});

mRealm是Realm数据库实例,点击这里查看Realm官方文档,在这里我异步执行了一次查找,没有想到提示报错。

Realm objects can only be accessed on the thread they were created.

意思就是Realm对象只能在它创建的线程上访问。

首先说明一下,mRealm的创建代码如下:

mRealm = Realm.getInstance(new RealmConfiguration.Builder(this)
                .name("test")
                .build());

我在示例DEMO中的onCreate()方法中创建。然后点击界面上一个按钮时,再执行查找操作,我把查找代码放在事务当中,并且调用的是异步执行的接口,这是为了防止ANR,代码在文章最开始的地方。没有想到这里却抛出了一个异常,导致程序关闭。

那么怎么解决呢?

方法1 调用Transaction对象中的execute()中传递的参数对象

只需要把代码改成这样

mRealm.executeTransactionAsync(new Realm.Transaction() {
   @Override
   public void execute(Realm realm) {
    //将之前的mRealm改成realm参数对象就可以了
       final RealmResults<Apple> realmResults = realm.where(Apple.class).findAll();

       for(Apple apple:realmResults){
           Log.d(TAG, "query "+apple.toString());
       }
   }
});

问题解决。

方法2 设置Realm的DefaultInstance。

在Realm初始化的时代这样编写代码:

RealmConfiguration config = new RealmConfiguration.Builder(this)
                .name("test")
                .build();
        Realm.setDefaultConfiguration(config);
        mRealm = Realm.getDefaultInstance();

然后在异步调用的时候,获取它的DefaultInstance。

mRealm.executeTransactionAsync(new Realm.Transaction() {
   @Override
   public void execute(Realm realm) {
       final RealmResults<Apple> realmResults =
               Realm.getDefaultInstance().where(Apple.class).findAll();

       for(Apple apple:realmResults){
           Log.d(TAG, "query "+apple.toString());
       }
   }
});

Realm.getDefaultInstance() 替换之前的mRealm ,同样不会再报错了。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Realm数据库学习之快速入门

    任何数据库都无非是CRUD的操作,也就是为了增、删、改、查的使命。 相对于传统的原生的Sqlite开发,Realm的API使开发者显得轻松自在。

    Frank909
  • AndroidStudio不自动添加新创建的文件到VCS

    从远程仓库下载了一份源码,版本控制是用的SVN。但发现了一个问题,修改和删除文件时,版本管理都有记录。但是如果我新建一个文件时,却发现没有自动关联到VCS,也不...

    Frank909
  • 【深度学习】经典神经网络 ResNet 论文解读

    ResNet 是何凯明团队的作品,对应的论文 《Deep Residual Learning for Image Recognition》是 2016 CVPR...

    Frank909
  • Realm数据库 从入门到“放弃”

    Realm是由Y Combinator公司孵化出来的一款可以用于iOS(同样适用于Swift&Objective-C)和Android的跨平台移动数据库。目前最...

    一缕殇流化隐半边冰霜
  • Realm数据库学习之快速入门

    任何数据库都无非是CRUD的操作,也就是为了增、删、改、查的使命。 相对于传统的原生的Sqlite开发,Realm的API使开发者显得轻松自在。

    Frank909
  • 又双叒叕拿奖!腾讯安全天御荣获“联邦学习应用奖”

    近日,第五届CCF-GAIR全球人工智能与机器人峰会上,腾讯安全天御凭借其在信贷风控场景的落地实践,荣获首个CCF-GAIR“联邦学习应用奖”,标志着腾讯安全在...

    腾讯安全
  • 知识图谱推理与实践(1)

    由于工作原因,需要在系统里建立图谱推理功能,因此简单学习了浙江大学 陈华钧教授 知识图谱导论课程课件,这里记录下学习笔记。

    用户1177380
  • 快速学习-SpringMVC 中的异常处理

    系统中异常包括两类:预期异常和运行时异常 RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异...

    cwl_java
  • 弄明白Kubernetes的RBAC政策

    我们大多数人都玩过具有完全管理员权限的Kubernetes,我们知道在真实环境中我们需要:

    CNCF
  • 系统吞吐量、用户并发量、性能测试的概念和公式

    一个系统的吞度量(承压能力)与request对CPU的消耗、外部接口、IO等等紧密关联。

    物流IT圈

扫码关注云+社区

领取腾讯云代金券