前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >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 acce

作者头像
Frank909
发布2019-01-14 18:04:09
1.6K0
发布2019-01-14 18:04:09
举报
文章被收录于专栏:Frank909Frank909Frank909

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 ,同样不会再报错了。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016年12月12日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 方法1 调用Transaction对象中的execute()中传递的参数对象
  • 方法2 设置Realm的DefaultInstance。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档