我最近尝试通过将一些数据结构发布到一个简单的键值映射来简化它们。我在.put方法中按下日志以验证该值是否与密钥相关联。
当我稍后调用.get时,该值不再可用。重要的代码段:
MainActivity.class
public final HashMap<String, Integer> resumeMap = new HashMap<String, Integer>();
if (resumeMap.containsKey(url)) {
Log.i("Value is there!", url);
resumeTime = resumeMap.get(url);
Log.i("Value set to:", "" + resumeTime);
} else {
resumeTime = 0;
Log.i("Value is not found!", "" + url);
}
public void setHashmap(String url, Integer time) {
resumeMap.put(url, time);
int newTime = resumeMap.get(url);
Log.i("Setting:", "URL: " + url);
Log.i("Setting:", "TIME:" + newTime);
}
VideoPlayer.class
MainActivity setter = new MainActivity();
setter.setHashmap(urlString, player.getCurrentPosition());
在setHashmap方法中,日志正确地按预期输出url和time。但是,即使调试器通过“未找到值!”确认预期的匹配键,resumeMap.containsKey(url)仍为false。输出。
为了说清楚,在MainActivity的第一次传递中,我期望找不到结果,然后使用resumeTime为0调用VideoPlayer类并获得正确的结果。我验证了密钥和值的设置,当我打开相同的链接时,我仍然收到0。
我最初在它自己的类中构建了Hashmap,结果相同。我将地图移动到MainActivity只是为了调试。感谢您提供的任何帮助。
答案 0 :(得分:2)
活动实例会一直被快速销毁并重新创建,例如,当您旋转屏幕时(但由于其他原因)。通常看起来Activity仍然“仍然存在”,但实际的底层对象实例已被破坏并重新创建。
在关闭实例状态包路径之前验证这确实是问题的一种快速方法是使HashMap静态以防止实例销毁破坏它。
有时,这样的static
地图是可以的,但请谨慎行事,因为这样的结构为整个地方的内存泄露开辟了道路。更好的方法是使用某种持久性,或者如果您在使用Activity时只需要信息,请使用onSaveInstanceState
和onRestoreInstanceState
传递信息(请参阅http://developer.android.com/training/basics/activity-lifecycle/recreating.html)< / p>