【问题标题】:Safely deserializing LinkedHashMap in android在android中安全地反序列化LinkedHashMap
【发布时间】:2014-12-11 13:43:02
【问题描述】:

我有一个 LinkedHashMap,我想通过 Bundle savedInstanceBundle 将其存储在屏幕旋转之间。我如何安全地做到这一点?之前我只是施放它,因为我知道我在其中投入了什么以及从中得到什么,但这确实产生了一个警告,表明它被认为是不安全的施放。

我现在在做什么:

    @Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
        super.onSaveInstanceState(savedInstanceState);
        if(thumbnails != null) {
            savedInstanceState.putSerializable("thumbnails", thumbnails);
        }
    }

并检索它

thumbnails = (LinkedHashMap<Long, Bitmap>)savedInstanceState.getSerializable("thumbnails");

从 Bundle 中反序列化 LinkedHashMap 的正确方法是什么?可以做到吗?如果没有,我如何保持顺序而不在其间添加另一个层来跟踪涉及更改大量现有代码的位置?

` Caused by: java.lang.ClassCastException: java.util.HashMap cannot be cast to java.util.LinkedHashMap`

【问题讨论】:

  • 缩略图是 HashMap 还是 LinkedHashMap?
  • 这是一个LinkedHashMap
  • 您无法在 Android 中可靠地将 LinkedHashMap 插入/检索到 Bundle。你得到的是HashMap,而不是LinkedHashMap。更多详情请见my answer to this question

标签: android casting classcastexception type-safety linkedhashmap


【解决方案1】:

MVC模型 -- 视图 -- 控制器)的角度来看,Activity 是一个控制器。 (Fragment 也是如此。)View 由 XML 和您重用的 Android View 子类组成(人们很少定义自定义 View 子类)。 Model 是 --- 好吧,你必须自己为 Model 定义一个类!如果你有 Model,你会从不同的角度看待问题。

但是,如果您仍然想将数据从一个 Activity 化身传递到另一个 - 那么,您为什么不使用 JSONObject/JSONArray?这是一个矫枉过正,它会很慢,但它至少应该工作。

另一种可能性是将LinkedHashMap 转换为键值对列表,然后从该列表中重构它。

【讨论】:

  • 非常有趣的建议。我已经实现了一个 Gson 外观类,因此来回转换应该不是问题。经过 15 页的 google 结果后,我现在明白这是由于 java 泛型首先将其转换为 HashMap,因此无论如何都无法使用标准的 LinkedHashMap 来维护顺序。如果这不适用于图像,我将扩展我目前拥有的包装类并使用它来重新创建 LinkedHashMap。一切似乎有点贵,但至少它会起作用。我很受启发,谢谢!
  • 嗯,两种解决方案都有效,但速度很慢,所以我最终更改了代码并使用 ArrayList 以获得更好的性能。
  • 请注意,Model 是必须在屏幕转动后幸存下来的。 Model 只有在进程被杀死时才会死掉,所以它必须保存在 onPause() 中,但是当屏幕显示发生变化时你不必打包/解包它.当 Model 死亡时,静态指针被设置为 null(嗯,设置为它们的默认值),因此您可以检测到。
  • 我正在使用一个 viewpager,它在每个页面上调用相机功能,据我所知,onPause() 永远不会被调用。
  • AFAIK 那是不可能的。你是怎么检查的?我可以相信断点不起作用,但Lod.d("~~~","~~~onPause()") 应该显示在adb logcat | grep '~~~' 中。
猜你喜欢
  • 2011-02-22
  • 1970-01-01
  • 2012-12-08
  • 1970-01-01
  • 2012-03-25
  • 1970-01-01
  • 1970-01-01
  • 2021-11-21
  • 2017-04-03
相关资源
最近更新 更多