2016-08-21 2 views
0

私のアプリケーションでは、レルム結果に基づいて複雑なアルゴリズムを実行し、結果を拡張可能なリストビューに表示します。アルゴリズムが少し重いので、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すべての場所他のすべてのクエリはメインスレッドにありますが、アプリケーション内のこのクエリ以外は正常に実行されています)
+0

トランザクション内でこのクエリを実行すると、Samsung Ace Nxtでも適切な値が返されることを確認できますか? – EpicPandaForce

+0

@EpicPandaForce:トランザクションの中でコール・クエリーを行うwlhyを書いていませんか?トランザクションブロックは書き込みトランザクション用です[https://realm.io/docs/java/latest/#writes] – sbr1308

+0

Realmを最新バージョンに強制することによって(トランザクションでアルゴリズムを実行することによって)、データは実際に利用可能です。 'doInBackground()'に 'realm.executeTransaction()'を使ってください。 – EpicPandaForce

答えて

1

バックグラウンドスレッドでアルゴリズムを開始する際の競合状態になる可能性が最も高く、 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()は、データが挿入されるまで待つことを余儀なくされ、トランザクションは、あなたが探しているTotalTransactionを見るためにレルムを強制的に、データの最新バージョンを読み込みますために。

+0

ありがとう@EpicPandaForce。はい、本当に競争状態でした。以前の画面での私のコミットトランザクションが画面forward.onceの後であったため、このバックグラウンドクエリが正しく機能するように修正しました。なぜ他のデバイスがそれに遭遇しなかったのか分かりませんが、役に立つ説明のために感謝します:-) – sbr1308

関連する問題