领域查询在 kitkat 设备中的异步任务中返回 null

Realm Query returning null inside asynctask in kitkat device

在我的应用程序中 运行 基于领域结果并在可扩展列表视图中显示结果的复杂算法。由于该算法有点繁重,我决定在 Asynctask 中执行并在列表视图 onPostExecute 中显示结果。无法跨线程访问 Realm,因此我打开并关闭了自己的 localRealm 实例。我已经检查了这段代码,并且在特定的 kitkat 设备查询结果返回 null.Since 的 lollipop、kitkat、jellybean devices.But 中一切顺利在那个设备上没有做同样的事情。我在下面的代码和我从 Asynctask doInBackground 方法调用它。

Realm localRealm = Realm.getInstance(RealmUtility.getRealmConfig(mContext));
try {
     TotalTransaction totalTransaction = localRealm.where(TotalTransaction.class).equalTo("pk", totalTransactionPk).findFirst(); // returning null so doesn't enter inside if block
 if (totalTransaction != null && totalTransaction.isLoaded()) {
  // run algorithm and other related works based on realm results
 } catch (Exception e) {
  e.printStackTrace();
 } finally {
  if (localRealm != null) localRealm.close();
 }

和我的 gradle 配置:

compileSdkVersion 23
    buildToolsVersion '23.0.3'
    defaultConfig {
        applicationId 'com.***.***'
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 5
        versionName '1.1.5'
        multiDexEnabled true
    }

我也知道领域新的 findAllAsync 和 findFirstAsync 方法,但我的查询结果相当短,并且由于基于查询结果的大量计算而使用 inside asynctask。

领域版本:1.1.0 android 工作室:2.1.2 java : 1.7

测试设备:

当您在后台线程上启动算法并打开 Realm 实例时,您很可能 运行 陷入竞争状态,数据尚未在另一个线程上提交.

要强制 Realm 实例为最新版本,您可以尝试在事务中执行算法。请注意事务是阻塞的,因此虽然算法是 运行,但其他线程会等到它完成后再开始自己的事务。

Realm localRealm = Realm.getInstance(RealmUtility.getRealmConfig(mContext));
try {
     localRealm.executeTransaction(new Realm.Transaction() {
         @Override
         public void execute(Realm localRealm) {
             TotalTransaction totalTransaction = localRealm.where(TotalTransaction.class).equalTo("pk", totalTransactionPk).findFirst(); // returning null so doesn't enter inside if block
             if (totalTransaction != null && totalTransaction.isLoaded()) {
                //...
             }
         }
     });

这样,executeTransaction()将被迫等待数据插入(因为事务是阻塞的),事务将读取最新版本的数据,迫使Realm看到TotalTransaction 你要找的。