2

我对官方 android FAQ中的以下建议特别感兴趣。

对象弱引用的 HashMap

您还可以使用弱引用的 HashMap 到具有长键的对象。当一个 Activity 想要将一个对象传递给另一个 Activity 时,它只需将该对象放入映射中并通过 Intent Extras 将密钥(这是一个基于计数器或时间戳的唯一 Long)发送给接收者 Activity。接收者活动使用此键检索对象。`

我还没有找到如何正确实现这一点的方法。而且我不确定为什么这里首选 WeakReferences 以及为什么不使用硬引用。

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

  • 接收服务具有对象的静态 HashMap。

    public static HashMap<Long, Object> parameters = new HashMap<Long, Object>();
    
  • 发送部分的代码(活动 A)

    long key = SystemClock.elapsedRealtime();
    B.parameters.put(key, new XY());
    Intent i = new Intent(this, B.class);
    i.putExtra("PARAM_UPLOAD", key);
    startService(i);
    
  • 接收方代码(服务 B)

    long key = intent.getLongExtra("PARAM_UPLOAD", -1);
    XY data = (XY)parameters.get(key);
    

该代码使用硬引用。为什么我应该在这里使用弱引用(如常见问题解答所建议的那样)?这种用于传递数据的使用模式是否可以,或者您是否更喜欢其他东西。

4

1 回答 1

5

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

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

这种用于传递数据的使用模式是否可以,或者您是否更喜欢其他东西。

我更喜欢只在活动之间传递简单的数据。任何不是原语(或系统提供的Parcelable,如 a PendingIntent)的东西都应被视为数据模型的一部分,并应照此进行管理。这是一篇博客文章,我将在其中详细介绍。

于 2010-11-11T13:57:56.083 回答