Android:从不正确的线程访问领域。Realm 对象只能在创建它们的线程上访问

MrR*_*ot9 0 android realm android-asynctask android-thread

因此,在 a 中IntentService,应用程序可能处于活动状态或非活动状态,onHandleIntent被调用,我将其放置在代码下方。这是我将数据存储到领域的地方。

 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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

然后我尝试在onPostExecutein 中访问它AsyncTask,在 中doInBackground,我正在获取RealmResults<AppItem>,然后将其存储到List <AppItem>并将其发送到onPostExecute放置此代码的位置。appItems这里是 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;


               }
              }
            });
Run Code Online (Sandbox Code Playgroud)

我都使用过executeTransactionAsync,但仍然出现以下错误。

java.lang.IllegalStateException: Realm access from incorrect thread. Realm objects can only be accessed on the thread they were created.
Run Code Online (Sandbox Code Playgroud)

Moo*_*oom 6

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

AsyncTask 中的“doInBackground”在后台线程上运行。“onPostExecute”在 UI 线程上运行。所以在这里你在后台线程上获得 Realm 对象,并尝试在 UI 线程上访问它们 => 异常。

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

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