领域查询在 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
测试设备:
- 棒棒糖:三星 J1 Nxt、三星 J2、三星 S6、索尼 Z3
- Kitkat:三星 Note2、Symphony Xplorer W69Q
- Jellybean:Walton primo
- 有问题的 Kitkat 设备:Samsung Ace Nxt(仅供参考,应用程序中除此查询之外的所有其他内容 运行 正确,尽管所有其他查询都在主线程中)
当您在后台线程上启动算法并打开 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
你要找的。
在我的应用程序中 运行 基于领域结果并在可扩展列表视图中显示结果的复杂算法。由于该算法有点繁重,我决定在 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
测试设备:
- 棒棒糖:三星 J1 Nxt、三星 J2、三星 S6、索尼 Z3
- Kitkat:三星 Note2、Symphony Xplorer W69Q
- Jellybean:Walton primo
- 有问题的 Kitkat 设备:Samsung Ace Nxt(仅供参考,应用程序中除此查询之外的所有其他内容 运行 正确,尽管所有其他查询都在主线程中)
当您在后台线程上启动算法并打开 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
你要找的。