私のアプリケーションでは、レルム結果に基づいて複雑なアルゴリズムを実行し、結果を拡張可能なリストビューに表示します。アルゴリズムが少し重いので、Asynctaskでそれを行い、結果をlistview onPostExecuteで表示することにしました。私は自分のlocalRealmインスタンスを開いたり閉じたりしたので、レルムはスレッド間でアクセスできません。私はこのコードと、ロリポップ、kitkat、jellybeanデバイスでスムーズに起こっているすべてをチェックしました。しかし、特定のkitkatデバイスクエリ結果でnullが返されます。なぜなら、すべてがロリポップデバイスで完璧に機能していたからです。そのデバイスで以下の私のコードと私はこれをAsynctask doInBackgroundメソッドから呼び出しています。Realm Queryは、kitkatデバイスのasynctask内でnullを返します
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方法について承知していますが、私のクエリ結果は、クエリの結果に基づいて、むしろ短いと重い計算にasynctaskの内側に使用しています。
レルムバージョン:1.1.0 アンドロイドスタジオ:2.1.2 のjava:1.7
試験装置:
- ロリポップ:サムスンJ1 NXT、サムスンJ2、サムスンS6、ソニーZ3
- キットカット:サムスン注2、シンフォニーXplorerのW69Q
- Jellybean:ウォルトンプリモ
- 問題のキットカットデバイス:サムスンのエースNXT(FYIすべての場所他のすべてのクエリはメインスレッドにありますが、アプリケーション内のこのクエリ以外は正常に実行されています)
トランザクション内でこのクエリを実行すると、Samsung Ace Nxtでも適切な値が返されることを確認できますか? – EpicPandaForce
@EpicPandaForce:トランザクションの中でコール・クエリーを行うwlhyを書いていませんか?トランザクションブロックは書き込みトランザクション用です[https://realm.io/docs/java/latest/#writes] – sbr1308
Realmを最新バージョンに強制することによって(トランザクションでアルゴリズムを実行することによって)、データは実際に利用可能です。 'doInBackground()'に 'realm.executeTransaction()'を使ってください。 – EpicPandaForce