Java 如何正确打包列表<;哈希表<;字符串,列表<;字符串>&燃气轮机&燃气轮机;为了广播?

Java 如何正确打包列表<;哈希表<;字符串,列表<;字符串>&燃气轮机&燃气轮机;为了广播?,java,android,android-intent,broadcastreceiver,Java,Android,Android Intent,Broadcastreceiver,在Android上,我尝试使用自定义的意图和广播侦听器发送自定义广播消息。我有一些自定义数据,格式如下: List<Hashtable<String,List<String>>> data; 我得到一个错误: The method putExtra(String, boolean) in the type Intent is not applicable for the arguments (String, List<Hashtable<Str

在Android上,我尝试使用自定义的意图和广播侦听器发送自定义广播消息。我有一些自定义数据,格式如下:

List<Hashtable<String,List<String>>> data;
我得到一个错误:

The method putExtra(String, boolean) in the type Intent is not applicable for the  arguments (String, List<Hashtable<String,List<String>>>)

但是,我不知道如何将我的数据转换成捆绑包来使用它。这样做对吗?还是有一种更简单的方法?

您想为
putExtra(字符串名称,可序列化的s)
版本设置可序列化的。但是,
List
是一个不扩展
Serializable
的接口。尝试将其声明为
ArrayList

我曾经遇到过一些问题。我以一种丑陋的方式解决了它,我想,你可以把它作为参考

我将
Map
放入一个全局单例对象中,
Map
的键是
String
Map
将保留我要传递到
Intent
的对象,而不是将对象放入
Intent
,我将
String
键放入
Intent
。在意图传递到的
活动(或服务…)中,我从
intent
获取密钥,然后从
Mao
获取我真正关心的对象

也许这还不够清楚,下面是伪代码:

public void sendIntent() {
    Object data; // the object you want to pass through Intent
    Map<String, Object> globalMap = getMyGlobalMap();
    String uid = UUID.randomUUID().toString();
    globalMap.put(uid, data);
    intent.putExtra(EXTRA_OBJECT_UID, uid);
}

public void receiveIntent() {
    String uid = intent.getStringExtra(EXTRA_OBJECT_UID);
    Object data = getMyGlobalMap().get(uid); // Here is your data object.
}
public void sendIntent(){
对象数据;//要通过的对象
Map globalMap=getMyGlobalMap();
字符串uid=UUID.randomUUID().toString();
全局映射put(uid,数据);
intent.putExtra(额外对象UID,UID);
}
公共无效接收意图(){
stringuid=intent.getStringExtra(EXTRA\u OBJECT\u uid);
对象数据=getMyGlobalMap().get(uid);//这是您的数据对象。
}
请注意,由于您将全局映射放在一个单例对象中,因此在处理完该对象后,您可能希望从
映射中删除该对象,因为只要应用程序存在,映射就会一直存在,因此您可能不想保留一些无用的对象,让它们占用您宝贵的内存

更新

另一件非常重要的事情是,发送意图的组件和接收意图的组件必须在同一进程中,只有同一进程中的类才能共享堆中的数据。

OMG。。。跑列表..:-如果你这样做了,上帝,就不要发送广播。这到底有什么意义?只有同一进程的人才能利用广播;只要有一个本地对象,您就可以对其进行回调。@hackbod正如我在回答中提到的,我认为这不是通过Intent传递复杂对象的好方法。但是如果你只想在你的应用程序中传递这个对象,并且使你的对象可分配(如<代码>列表< /代码>)是非常复杂的,那么我想你可能想考虑这个解决方案。这就是我所同意的。如果只想在应用程序中传递对象,请不要使用广播。广播用于在应用程序之间发送意图。如果这只是你的应用程序内部的,那就是浪费。我浪费了大量的CPU时间,因为这需要至少两个IPC将您的整个意图从系统发送回应用程序,在您的时间,因为您需要确保您的数据以可以跨进程传输的方式放置在意图中。谢谢,通过使用ArrayList,我能够将其传递给putExtra()没有额外的工作,请注意使用序列化是非常昂贵的。正如文件所说,强烈反对这样做。
putExtra(String name, Bundle value)
public void sendIntent() {
    Object data; // the object you want to pass through Intent
    Map<String, Object> globalMap = getMyGlobalMap();
    String uid = UUID.randomUUID().toString();
    globalMap.put(uid, data);
    intent.putExtra(EXTRA_OBJECT_UID, uid);
}

public void receiveIntent() {
    String uid = intent.getStringExtra(EXTRA_OBJECT_UID);
    Object data = getMyGlobalMap().get(uid); // Here is your data object.
}