2017-01-31 27 views
1

美好的一天。我有一個領域的問題。在循環中使用領域或插入列表Android

首先,我認爲一個好的數據庫用於本地數據存儲,並且我開發了一個社交網絡,我在本地和每個應用程序上保存消息開始我從服務器下載消息以將其保存在本地讓我們說要使用當前會話。 Realm似乎是開箱即用的最佳解決方案,但我遇到了由於Realm事務導致我的UI被阻止的不好情況。這裏是情況。

•我必須從UI線程中使用Realm對象,否則它會拋出異常,說我需要從我調用的線程訪問對象,所以在這種情況下,領域中的executeTransactionAsync將不能工作交易實際上將發生在UI線程上

•這是第一次這樣的問題,但我想象我自己爲什麼它不是一個問題之前,因爲我的mesasges不是那麼多,現在我有40個消息和哇......真正可怕的界面UI(大約4秒),這是一種可怕的方式。

•我試圖運行領域的實際事務和我在一個單獨的線程中調用的方法,但不會因爲最終Realm對象必須從UI線程訪問而失敗,所以沒有背景運氣線程在所有。

因此,如果有人可以請我來這裏尋求幫助嗎?

這是境界方法的代碼

public void insertMessage(final String userId, final String opponentId, final String message, 
          final String messageId, final String date, 
          final String id, final String deliveryStatus, 
          final String userImage, 
          final String opponentImage, final String deleteOpponentId, 
          final String deleteUserId, 
          final boolean hasGif, final String gifUrl, final boolean animated) { 

    if (!isMessageExist(messageId)) { 
     handler.post(new Runnable() { 
      @Override 
      public void run() { 

      } 
     }); 
     mRealm.executeTransaction(new Realm.Transaction() { 
      @Override 
      public void execute(Realm realm) { 
       MessageModel messageModel = realm.createObject(MessageModel.class); 

       messageModel.setId(id); 
       messageModel.setMessageId(messageId); 
       messageModel.setMessage(message); 
       messageModel.setUserId(userId); 
       messageModel.setOpponentId(opponentId); 
       messageModel.setAnimated(animated); 
       messageModel.setDeliveryStatus(deliveryStatus); 
       messageModel.setUserImage(userImage); 
       messageModel.setOpponentImage(opponentImage); 
       messageModel.setDate(date); 
       messageModel.setHasGif(hasGif); 
       messageModel.setGifUrl(gifUrl); 
       messageModel.setDeleteUserId(deleteUserId); 
       messageModel.setDeleteOpponentId(deleteOpponentId); 
      } 
     }); 
    } 


} 

手柄是在這一刻

的基本UI線程和我所說的循環在那裏我得到的消息數組內這種方法,這是它,請幫忙嗎?

+0

就在另一個線程做異步交易創建領域實例,你是好去。 – AnixPasBesoin

+1

爲什麼不使用'executeTransactionAsync()'? – EpicPandaForce

+0

'我試圖運行領域的實際事務和我在一個單獨的線程中調用的方法,但是這不會影響最終Realm對象必須從UI線程訪問,所以在後臺線程沒有運氣的時候all.'請閱讀文檔以及'RealmChangeListener'如何工作,https://realm.io/docs/java/latest/#notifications通常不需要訪問任何受管理的Realm *類別,它們是 – EpicPandaForce

回答