1

Я дезацинирую свой xml в async-задаче. В каком-то конкретном случае я выхожу из памяти при десериализации. Я знаю, что есть флаг под названием 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

Сколько из этих элементов детализации игры есть? –

+0

На самом деле это не предел, возможно, у него 20 или может быть 80. Зависит от того, какая услуга присылает мне – Android

+0

Итак, где все данные? В 'gameXml'? Насколько это велико? –

ответ

0

Я столкнулся с проблемой по простой причине, размер строки был огромным. ОГРОМНЫЙ. Si простое решение будет сократить объем данных, которые обрабатываются. Поэтому я решил уменьшить размер строки. Я отделил данные изображения от XML и сохранил их в другой таблице. Это уменьшает объем данных, необходимых для де-сериализации. Я загружаю дополнительные данные отдельно. Спасибо за ответы и за ваше драгоценное время.

+0

@ Android. Вы видите мой вопрос? https://stackoverflow.com/questions/48563909/illegalstateexception-fragment-already-added-android?noredirect=1#comment84192332_48563909 –

1

Проблема заключается не в каком-либо конкретном коде в вашем приложении, а в базовом дизайне. У вас слишком много данных, которые вы пытаетесь обработать сразу.

Не сериализуйте данные (и особенно не используйте XML, я бы предположил, что для начала не требуется разметка).

Вместо этого сохраните все данные в играх в правильно нормированной базе данных (т. Е. Используйте таблицы/столбцы для всего). Не загружайте все сразу, но загружайте только столько, сколько вам нужно.

Смежные вопросы