附件参考我之前的问题:-内存不足 https://stackoverflow.com/questions/25928354/out-of-memory-during-xml-deserialisation
我会尽力做到尽可能精确。我从我的网络服务调用中得到一个长的 base64 字符串的响应。我解码该字符串并得到一个包含我的数据的巨大字符串。我反序列化该字符串并使用该字符串创建我的类的对象,如下所示。
String decryptedXml = XmlObject.toDecryptedXmlString(gameDetail.getGameData(), app.getSessionEncryptionKey());
Game noviceGame = deserialiseGame(decryptedXml, NoviceGamer.class);
desrialiseGame() 只是一种反序列化数据并创建并返回我的游戏实例的方法。为了维护这个对象到多个会话(登录/注销),我将整个游戏数据(我的字符串,其反序列化给了我我的游戏实例)存储在数据库中。
下次当用户登录时,为了创建游戏实例,我从数据库中获取字符串,并再次尝试反序列化,以便取回我的游戏实例。但是,当我尝试从数据库获取字符串时,在获取字符串时出现“内存不足”异常。
调用反序列化游戏的方法如下。
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);
}
}
}
我的数据库事务如下:
@Override
protected GameEntity getEntityFromCursor(Cursor cursor)
{
String gameRef = cursor.getString(cursor.getColumnIndex(GAME_REF));
String detailLevel = cursor.getString(cursor.getColumnIndex(DETAIL_LEVEL));
int gameVersion = cursor.getInt(cursor.getColumnIndex(GAME_VERSION));
String gameData = cursor.getString(cursor.getColumnIndex(GAME_DATA));
String status = cursor.getString(cursor.getColumnIndex(GAME_STATUS));
long longStart = cursor.getLong(cursor.getColumnIndex(VISIT_START_TIME));
Date startTime = longStart == -1 ? null : new Date(longStart);
long longFinish = cursor.getLong(cursor.getColumnIndex(VISIT_END_TIME));
Date finishTime = longFinish == -1 ? null : new Date(longFinish);
long longComplete = cursor.getLong(cursor.getColumnIndex(GAME_COMPLETION_TIME));
Date completionTime = longComplete == -1 ? null : new Date(longComplete);
GameEntity entity = new GameEntity(gameRef, detailLevel, gameVersion, gameData, );
entity.setGameStatus(status);
entity.setStartTime(startTime);
entity.setFinishTime(finishTime);
entity.setGameCompletionTime(completionTime);
return entity;
}
但是当我尝试从数据库 @Line 获取数据时String gameData = cursor.getString(cursor.getColumnIndex(GAME_DATA));
我出现内存不足错误。根据我的发现,当我在应用程序标记的清单中添加标志 largeHeap=true 时,我的应用程序变得非常慢。还有developer.android 指出
永远不要仅仅因为内存不足而请求大堆
你需要一个快速修复——只有当你确切知道时才应该使用它
所有内存都在哪里分配以及为什么必须保留它。
然而,即使您确信您的应用程序可以证明大堆是合理的,
您应该尽可能避免提出请求。
谁能建议我如何避免这种情况。大多数SO问题都没有包含位图的使用。任何帮助将不胜感激。