Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 用于在活动之间传递数据的WeakReference的HashMap_Android_Communication_Hashmap_Weak References - Fatal编程技术网

Android 用于在活动之间传递数据的WeakReference的HashMap

Android 用于在活动之间传递数据的WeakReference的HashMap,android,communication,hashmap,weak-references,Android,Communication,Hashmap,Weak References,我特别感兴趣的是委员会的以下建议 对象的WeakReference的HashMap 您还可以使用weakreference到具有长键的对象的HashMap。当一个活动希望将一个对象传递给另一个活动时,它只需将该对象放入映射中,并通过intent extras将密钥(基于计数器或时间戳的唯一Long)发送给接收方活动。收件人活动使用此键检索对象` 我还没有找到一种方法来正确地实现这一点。我不知道为什么这里更喜欢weakreference,为什么不使用硬引用 我的实现(我想将类XY的一个实例从活动A

我特别感兴趣的是委员会的以下建议

对象的WeakReference的HashMap

您还可以使用weakreference到具有长键的对象的HashMap。当一个活动希望将一个对象传递给另一个活动时,它只需将该对象放入映射中,并通过intent extras将密钥(基于计数器或时间戳的唯一Long)发送给接收方活动。收件人活动使用此键检索对象`

我还没有找到一种方法来正确地实现这一点。我不知道为什么这里更喜欢weakreference,为什么不使用硬引用

我的实现(我想将类XY的一个实例从活动A发送到服务B):

  • 接收服务具有对象的静态哈希映射

    public static HashMap<Long, Object> parameters = new HashMap<Long, Object>();
    
  • 接收部件代码(服务B)

代码使用硬引用。为什么我要在这里使用弱引用(如常见问题解答所建议的)?这种用于传递数据的使用模式是正确的,还是您更喜欢其他模式

为什么我要在这里使用弱引用(如常见问题解答所建议的)

因为你正在泄漏内存。您在静态
HashMap
中放入的任何内容都不会被垃圾收集

这种用于传递数据的使用模式是正确的,还是您更喜欢其他模式


我更喜欢在活动之间只传递简单的数据。任何非原语的内容(或系统提供的
可打包的
,如
挂起的内容
)都应视为数据模型的一部分,并应按原语进行管理。我将在这里详细介绍。

Tnx。那么,将自定义类型对象数组从活动传递到服务的首选方式是什么(数据数组被传递到服务,从那里它被上传到在线服务器)。@humus:与对象一样。使用
bindService()
绑定到服务,您可以定义所需的任何API。下面是一个示例项目,它使用一个服务提供到Web服务的桥梁,将
位置
传递给该服务,并返回
数组列表
:@commonware“从不垃圾收集”-除非我们在启动的活动中、在结束时或在获取数据后立即手动执行此操作。与依赖自动收集相比,这种方法有什么错吗(暂时不考虑手动回收位图的必要性,如果我们通过的话)?我还担心已启动活动的弱引用数据的可用性。虽然它(是否有保证?)在初始启动时可用,但在销毁后不可见时,不会在活动的重新创建(onCreate(notNull))中使用。
long key = SystemClock.elapsedRealtime();
B.parameters.put(key, new XY());
Intent i = new Intent(this, B.class);
i.putExtra("PARAM_UPLOAD", key);
startService(i);
long key = intent.getLongExtra("PARAM_UPLOAD", -1);
XY data = (XY)parameters.get(key);