1

비동기 작업에서 XML을 비 직렬화하고 있습니다. 어떤 특정한 경우에는 역 직렬화 동안 메모리 오류가 발생합니다. 내 응용 프로그램에서 사용할 수있는 largeHeap 플래그가 있다는 것을 알고 있습니다. 그러나 그 장소에서 특별히 피하는 방법이 있습니까?XML deserialisation 중에 메모리가 부족합니다.

내 발견에 따라 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을 사용하지 마십시오. 먼저 마크 업이 필요하지 않습니다.

대신 게임의 모든 데이터를 적절하게 정규화 된 데이터베이스에 저장하십시오 (즉, 모든 항목에 대해 표/열 사용). 한 번에 모든 것을로드하지 말고 실제로 필요한만큼로드하십시오.