WeakReferences的HashMap,用于在活动之间传递数据

时间:2010-11-11 13:13:38

标签: android communication hashmap weak-references

我特别感谢official android FAQ的以下建议。

  

WeakReferences to Objects的HashMap

     

您还可以将WeakReferences的HashMap用于具有长键的对象。当活动想要将对象传递给另一个活动时,它只是将对象放入地图中,并通过意图附加功能将密钥(基于计数器或时间戳的唯一Long)发送给收件人活动。收件人活动使用此密钥检索对象。

我还没有找到如何正确实现这一点的方法。而且我不确定为什么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);
    

代码使用的是硬引用。我为什么要在这里使用弱引用(如FAQ所提出的)?并且这样的使用模式可以传递数据,或者您更喜欢其他内容。

1 个答案:

答案 0 :(得分:5)

  

为什么我应该在这里使用弱引用(如FAQ所提出的)?

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

  

这是一种用于传递数据的使用模式,还是您更喜欢别的东西。

我更喜欢在活动之间传递简单数据。任何非原始的(或系统提供的Parcelable,如PendingIntent)都应被视为数据模型的一部分,并应如此管理。 Here is a blog post我会详细介绍。