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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

frank909

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值