0

我最近尝试通过将一些数据结构发布到一个简单的键值映射中来简化它们。我推送一个日志以验证在 .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 和时间。然而 resumeMap.containsKey(url) 仍然是假的,即使调试器正在通过“找不到值!”确认预期的匹配键。输出。

为了清楚起见,在 MainActivity 的第一次传递期间,我预计未找到结果,然后调用 VideoPlayer 类,resumeTime 为 0,结果正确。我验证了键和值的设置,当我打开同一个链接时,我仍然收到 0。

我最初在它自己的类中构建了 Hashmap,结果相同。我将地图移动到 MainActivity 只是为了调试。感谢您提供的任何帮助。

4

1 回答 1

2

Activity 实例会一直快速销毁并重新创建,例如,当您旋转屏幕时(但也有其他原因)。通常看起来 Activity “仍然存在”,但实际的底层对象实例已被销毁并重新创建。

在进入实例状态捆绑路径之前验证这确实是问题的一种快速方法是使 HashMap 静态以防止实例破坏破坏它。

有时,static像这样的映射是可以的,但要谨慎行事,因为像这样的结构为到处泄漏内存开辟了道路。更好的方法是使用某种持久性,或者如果您只在使用 Activity 时需要信息,请使用onSaveInstanceState和传递信息onRestoreInstanceState(请参阅http://developer.android.com/training/basics/activity-lifecycle /recreating.html )

于 2013-07-24T22:17:27.453 回答