2016-08-21 20 views
0

在我的應用程序中運行基於領域結果的複雜算法並在可展開的列表視圖中顯示結果。由於該算法有點沉重,我決定在Asynctask中完成,並在listview onPostExecute中顯示結果。領域不能跨線程訪問,所以我打開並關閉了我自己的localRealm實例。我已經檢查了這段代碼,並且在棒棒糖,kitkat,jellybean設備中一切都很順利。但是在特定的kitkat設備查詢結果中返回null。由於棒棒糖設備中的所有工作都很完美,所以我發現它更難以理解它爲什麼不這樣做在那個設備裏。我的代碼如下,我從Asynctask doInBackground方法調用此方法。Realm查詢在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
  • Kitkat:Samsung Note2,Symphony Xplorer W69Q
  • 軟糖豆:Walton primo
  • 問題Kitkat設備:Samsung Ace Nxt(FYI everythi ng其他除此查詢以外的應用程序正常運行,但所有其他查詢都在主線程中)
+0

您可以請驗證,如果您在交易中執行此查詢,那麼即使在三星Ace Nxt上它也會返回適當的值? – EpicPandaForce

+0

@EpicPandaForce:我沒有做任何寫,然後我會在事務內部調用查詢嗎?事務塊用於寫入事務[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。是的,這確實是一個競爭條件。因爲我在前一個屏幕上的提交事務是在屏幕轉發之後進行的。我修復了這個後臺查詢工作正常的問題。不知道爲什麼其他設備沒有遇到它,但感謝有用的解釋:-) – sbr1308