Android:来自错误线程的领域访问。 Realm 对象只能在创建它们的线程上访问

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

所以在 IntentService 中,应用程序可能处于活动状态或非活动状态,onHandleIntent 被调用,我将它放在下面 code.This 是我将数据存储到领域的地方。

 Realm realm = null;
    try { 
        realm = Realm.getDefaultInstance();
        realm.executeTransactionAsync(new Realm.Transaction() {
            @Override
            public void execute(Realm realm) {

                for (AppItem item : items) {
                    AppItem item2 = realm.createObject(AppItem.class, UUID.randomUUID().toString());
                    item2.mName = item.mName;
                    item2.mCount = item.mCount;
                    item2.mUsageTime = item.mUsageTime;
                }
            }
        });
    } finally {
        if (realm != null) {
            realm.close();
        }
    }

然后我尝试在 AsyncTask 中的 onPostExecute 中访问它,在 doInBackground 中,我正在获取 RealmResults<AppItem>,然后将其存储到 List <AppItem> 并将其发送到放置此代码的 onPostExecuteappItems 这里是 ReamObject

 Realm backgroundRealm = Realm.getDefaultInstance();
            backgroundRealm.executeTransactionAsync(new Realm.Transaction() {
                @Override
                public void execute(Realm realm) {
                    for (AppItem item : appItems) { 
 //getting error here   if (item.mUsageTime <= 0) continue;
                        mTotal += item.mUsageTime;
                        item.mCanOpen = mPackageManager.getLaunchIntentForPackage(item.mPackageName) != null;


               }
              }
            });

这两个我都使用 executeTransactionAsync 完成了,但我仍然收到以下错误。

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

根据错误消息:一旦您在 1 个线程上获得任何 Realm 对象,就只能在该线程上访问它们。对其他线程的任何访问都会抛出该异常。

来自 AsyncTask 的

"doInBackground" 在后台线程上 运行。 "onPostExecute" 在 UI 线程上是 运行。所以在这里你在后台线程上获取 Realm 对象,并尝试在 UI 线程 => Exception.

上访问它们

您应该在后台线程上执行所有操作,或者在 UI 线程上执行所有操作。

如果您正在执行非常复杂的查询,我建议在 RealmQuery 上使用 "findAllAsync",因为这将 运行 在后台线程上进行查询,并将它们移至主线程, 但它由 Realm 以安全的方式在内部处理。

for (AppItem item : appItems) { 

如果 appItems 包含您从 UI 线程上的 RealmResults 获得的托管 RealmObject,则在后台线程上访问它们将失败。

realm.executeTransactionAsync((realm) -> { 给你一个 Realm 作为参数,在 Realm 的线程执行器上是 运行,所以 that 必须用于获取托管 RealmResults/RealmObjects 交易里面。

所以需要重新查询realm.executeTransactionAsync里面的对象,如果对象是托管的

            public void execute(Realm realm) {
                for (AppItem item : realm.where(AppItem.class).findAll()) {