1

我解散 - 在異步任務中序列化我的xml。在某些特定情況下,我將在反序列化時出現內存不足錯誤。我知道有一個名爲largeHeap的標誌,我可以在我的應用程序中使用它。但是有沒有什麼辦法可以在那個地方特意避開。在XML反序列化期間內存不足

根據我的發現System.gc()不是解決問題的最佳解決方案。任何人都可以幫助我解決這個問題。以下是代碼片段。

private HashMap<String, Game> games = new HashMap<String, Game>(); 

public void load(LocalDatabaseHelper localDbHelper) throws Exception 
{ 
    synchronized(gameLockObject) { 
     GameDetailDAO dao = new GameDetailDAO(localDbHelper); 

     //this will fetch me the all the entities from databse 
     ArrayList<GameDetailEntity> dbGameDetails = dao.getEntities(null, null); 

     for (GameDetailEntity gameDetail : dbGameDetails) { 
      String gameLevel = gameDetail.getDetailLevel();    

      String gameXml = gameDetail.getGameData(); 

      Game game = null; 
      if(gameLevel.equalsIgnoreCase("Novice")) { 
       game = Job.deserialiseJob(gameXml, NoviceLevel.class); 
      } 
      else if (gameLevel.equalsIgnoreCase("Expert")) { 
       game = Job.deserialiseJob(gameXml, ExpertLevel.class); 
      } 

      //set the job version 
      game.setGameversion(gameDetail.getGameVersion()); 
      game.setMagicNumber(gameDetail.getMagicNumber()); 
      game.setInactiveUser(gameDetail.getInactiveUser()); 
      game.setStartTime(gameDetail.getStartTime()); 
      game.setFinishTime(gameDetail.getFinishTime()); 
      game.setGameCompletionTime(gameDetail.getGameCompletionTime()); 
      if (!StringUtils.isNullOrEmpty(gameDetail.getGameStatus())) { 
       game.setGameStatus(GameStatus.valueOf(gameDetail.getGameStatus())); 
      } 

      //add the job to the store 
      games.put(gameDetail.getGameRef().toLowerCase(Locale.getDefault()), game); 
     } 
    } 
} 
+0

那裏有多少個遊戲細節實體? – 2014-09-22 16:51:36

+0

不是一個限制,它可能有20個,也可能有80個。取決於發送給我的服務 – Android 2014-09-22 16:53:13

+0

那麼,所有數據在哪裏?在'gameXml'中?它有多大? – 2014-09-22 16:54:52

回答

0

我遇到了問題,原因很簡單,字符串的大小很大。巨大。簡單的解決方案將減少正在處理的數據量。所以我決定減少字符串的大小。我已經從XML分離出圖像數據並存儲在不同的表格中。這減少了需要反序列化的數據量。我分別重新加載額外的數據。感謝您的寶貴時間和答案。

+0

@ Android。你能看到我的問題嗎? https://stackoverflow.com/questions/48563909/illegalstateexception-fragment-already-added-android?noredirect=1#comment84192332_48563909 – 2018-02-03 14:45:42

1

問題不在於您的應用程序中的任何特定代碼,而是基本設計。 您剛剛嘗試處理的數據太多。

不要序列化數據(特別是不要使用XML;我猜你不需要任何標記開始)。

取而代之的是,將遊戲的所有數據存儲在適當規範化的數據庫中(即,使用表/列來表示所有內容)。 不要一次加載所有內容,而只需加載實際所需的內容。