Android - LinkedHashMap无法在Activity之间传递

标签 android android-intent serialization linkedhashmap

我有一个非常奇怪的问题。我想做的就是通过一个 LinkedHashMap<String,HashMap<String,String>> (我只是在这里进行实验,我希望数据结构的选择保持不变,无论性能开销如何)通过 Intent 从一个 Activity 到另一个 Activity 的对象。在初始化和填充数据结构后,我尝试了两种方法:

 LinkedHashMap<String,HashMap<String,String>> mData = new LinkedHashMap<String,HashMap<String,String>>();
//insert data into LinkedHashMap

方法一:

 Intent intent = new Intent(this, TestActivity.class);             
 // as a Serializable
 intent.putExtra("DATA",mData)
 startActivity(intent);

方法 2:

 Intent intent = new Intent(this, TestActivity.class);             
 Bundle bundle = new Bundle();
 bundle.putSerializable("LIST",mData);
 intent.putExtra("DATA",bundle)
 startActivity(intent);

并在接收 Activity 中:

对于方法 1:

Intent intent = getIntent();
mData = (LinkedHashMap<String, HashMap<String, String>>) intent.getSerializableExtra("DATA");

对于方法 2:

Intent intent = getIntent();
Bundle bundle = intent.getBundleExtra("DATA");
mData = (LinkedHashMap<String, HashMap<String, String>>) bundle.getSerializable("LIST");

我一直遇到这个问题:

 Caused by: java.lang.ClassCastException: java.util.HashMap cannot be cast to java.util.LinkedHashMap
            at com.matchify.TestActivity.onCreate(TestActivity.java:56)
            at android.app.Activity.performCreate(Activity.java:5451)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1093)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2377)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2471)
            at android.app.ActivityThread.access$900(ActivityThread.java:175)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1308)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:146)
            at android.app.ActivityThread.main(ActivityThread.java:5602)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
            at dalvik.system.NativeStart.main(Native Method)

我做错了什么?如果我错过了一些非常明显的东西,请道歉。

最佳答案

我检查了LinkedHashMap的源代码,发现存储迭代顺序的数据结构被声明为transient:

transient LinkedEntry<K, V> header;

因此,即使将LinkedHashMap返回给新的Activity,就迭代而言,映射也会被破坏,这可能就是返回HashMap的原因.

如果您不需要保证迭代顺序,只需在第二个 Activity 中将其转换为 HashMap 即可,否则您可能需要编写自己的 Parcelable 保留顺序。

关于Android - LinkedHashMap无法在Activity之间传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32667130/

相关文章:

java - 应用程序重新启动时 Parse.enableLocalDatastore 抛出异常

android - ClassCastException:android.support.v4.graphics.drawable.DrawableWrapperHoneycomb 无法转换为 android.graphics.drawable.LayerDrawable

android - startActivity 创建一个新的 Activity 而不是放在前面(标志集)

c# - 简单数据结构的最轻序列化方法

java - Android 中的安全性 - Google 应用引擎系统

android - 覆盖android seekbar样式

android - 应用程序在使用服务 android 时关闭时崩溃,因为我正在尝试使用 Intent

android - 单击时会启动多个 Activity

多维数组的Java序列化

c++ - 脚本到二进制转换和对象序列化