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>
并将其发送到放置此代码的 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;
}
}
});
这两个我都使用 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()) {
所以在 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>
并将其发送到放置此代码的 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;
}
}
});
这两个我都使用 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()) {