android - XML 反序列化期间内存不足

标签 android xml serialization out-of-memory xml-deserialization

我在异步任务中反序列化我的 xml。在某些特定情况下,我在反序列化时遇到内存不足错误。我知道有一个名为 largeHeap 的标志,我可以在我的应用程序中使用它。但是有什么办法可以明确地避免在那个地方。

根据我的发现,System.gc() 可能不是修复它的最佳解决方案。任何人都可以帮助我完成它。下面是代码 fragment 。

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);
        }
    }
}

最佳答案

问题不在于您应用中的任何特定代码,而在于基本设计。 您试图同时处理的数据太多。

不要序列化数据(尤其不要使用 XML;我猜你不需要任何标记开始)。

相反,将游戏的所有数据存储在适当规范化的数据库中(即,对所有内容使用表/列)。 不要一次加载所有内容,而是只加载您实际需要的部分。

关于android - XML 反序列化期间内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25928354/

相关文章:

android - RecyclerView - 在 LinearLayouts 中使用适配器(或将 RecyclerView 与相应的 LayoutManager 一起使用)

xml - tcl dom 以列表形式获取属性

java - 使用 Java 提取 xml 值

python - 如何在更新 DRF 序列化器方法中确定 PATCH 请求

android - Android中在线数据OkHttpClient如何使用setCache

android - DeepLinking 可以工作,但无法使用 react 导航导航到预期屏幕

android - 如何在BaseActivty类中具有通用ViewModel

java - 用Java修改并输出成XML文件

algorithm - 反序列化序列化整体的部分;反序列化对象内容而不反序列化整个对象

serialization - Apache POI XWPFDocument 对象序列化