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)
根据错误消息:一旦您在 1 个线程上获得任何 Realm 对象,就只能在该线程上访问它们。对其他线程的任何访问都会引发该异常。
AsyncTask 中的“doInBackground”在后台线程上运行。“onPostExecute”在 UI 线程上运行。所以在这里你在后台线程上获得 Realm 对象,并尝试在 UI 线程上访问它们 => 异常。
您应该在后台线程上执行所有操作,或者在 UI 线程上执行所有操作。
如果您正在执行非常复杂的查询,我建议在 RealmQuery 上使用“findAllAsync”,因为这将在后台线程上运行查询,并将它们移至主线程,但它由 Realm 以安全方式在内部处理.
| 归档时间: |
|
| 查看次数: |
7288 次 |
| 最近记录: |