Android - LinkedHashMap 不能在 Activity 之间传递
Android - LinkedHashMap cannot be passed between Activities
我有一个很奇怪的问题。我想要做的就是将 LinkedHashMap<String,HashMap<String,String>>
(我只是在这里进行试验,无论性能开销如何,我都希望数据结构的选择保持不变)对象从一个 Activity 通过 Intent
。在初始化和填充我的数据结构后,我尝试了两种方法:
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);
方法二:
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.access0(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)
我做错了什么?如果我遗漏了一些非常明显的东西,我们深表歉意。
Bundle bundle = new Bundle();
bundle.putSerializable("factorsDataMap", mData);
Intent intent = new Intent(MainActivity.this, MoodSummary.class);
intent.putExtras(bundle);
startActivity(intent);
试试这个,希望它有效。如果您还有问题,请告诉我。
我查看了LinkedHashMap
的源代码,发现存储迭代顺序的数据结构声明为transient
:
transient LinkedEntry<K, V> header;
所以即使 LinkedHashMap
返回到新的 Activity,就迭代而言,地图也会被破坏,这可能是返回 HashMap
的原因.
如果您不需要保证迭代顺序,只需在第二个 Activity
中将其转换为 HashMap
,否则您可能必须编写自己的 Parcelable
以保留顺序.
试试这个希望对你有帮助!
Intent intent = new Intent(this, TestActivity.class);
intent.putExtra("hashmap", hashMap);
startActivity(intent);
//接收Activity:
hashMap = (HashMap<String,String>)intent.getExtras().getSerializable("hashmap");
LinkedHashMap<String,String> linkedMap = new LinkedHashMap<>(hashMap);
我有一个很奇怪的问题。我想要做的就是将 LinkedHashMap<String,HashMap<String,String>>
(我只是在这里进行试验,无论性能开销如何,我都希望数据结构的选择保持不变)对象从一个 Activity 通过 Intent
。在初始化和填充我的数据结构后,我尝试了两种方法:
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);
方法二:
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.access0(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)
我做错了什么?如果我遗漏了一些非常明显的东西,我们深表歉意。
Bundle bundle = new Bundle();
bundle.putSerializable("factorsDataMap", mData);
Intent intent = new Intent(MainActivity.this, MoodSummary.class);
intent.putExtras(bundle);
startActivity(intent);
试试这个,希望它有效。如果您还有问题,请告诉我。
我查看了LinkedHashMap
的源代码,发现存储迭代顺序的数据结构声明为transient
:
transient LinkedEntry<K, V> header;
所以即使 LinkedHashMap
返回到新的 Activity,就迭代而言,地图也会被破坏,这可能是返回 HashMap
的原因.
如果您不需要保证迭代顺序,只需在第二个 Activity
中将其转换为 HashMap
,否则您可能必须编写自己的 Parcelable
以保留顺序.
试试这个希望对你有帮助!
Intent intent = new Intent(this, TestActivity.class);
intent.putExtra("hashmap", hashMap);
startActivity(intent);
//接收Activity:
hashMap = (HashMap<String,String>)intent.getExtras().getSerializable("hashmap");
LinkedHashMap<String,String> linkedMap = new LinkedHashMap<>(hashMap);