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

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

问题描述:

我特别感兴趣的是official android FAQ的以下建议。用于在活动之间传递数据的WeakReferences的HashMap

一个HashMap在WeakReferences到对象

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

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

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

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

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

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

该代码是使用硬的引用(活性的)的接收部分(服务B)

long key = SystemClock.elapsedRealtime(); 
B.parameters.put(key, new XY()); 
Intent i = new Intent(this, B.class); 
i.putExtra("PARAM_UPLOAD", key); 
startService(i); 
  • 代码。为什么我应该在这里使用弱引用(如FAQ所提议的)?并且这种用于传递数据的使用模式还可以,或者您更喜欢别的东西。

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

    因为你正在泄漏记忆。你放在那个静态HashMap中的任何东西都不会被垃圾收集。

    而且是这样的传递数据确定使用模式或做你喜欢别的东西。

    我更喜欢只在活动之间传递简单的数据。任何不是原始的(或系统提供的Parcelable,如PendingIntent)都应被视为数据模型的一部分,并应按照这种方式进行管理。 Here is a blog post我在这里进入更多的细节。

    +0

    Tnx。那么将一个自定义类型对象从一个活动传递给一个服务的首选方式是什么?(从那里将数据传递到服务,并从上传到在线服务器)。 – Igor 2010-11-11 21:34:02

    +0

    @humus:就像对象一样。用bindService()绑定到服务,你可以定义你想要的任何API。下面是一个示例项目,它使用服务为Web服务提供桥接,将'Location'传递给服务并返回'ArrayList ':https:// github。com/commonsguy/cw-android/tree/master/Service/WeatherAPI/ – CommonsWare 2010-11-11 23:59:26

    +0

    @CommonsWare“永远不会垃圾收集” - 除非我们在启动的Activity中手动执行,结束时或在获取数据后立即执行。 与依赖自动收集相比,这种方法有什么问题吗(现在忽视手动回收Bitmap的必要性,如果我们通过它们)? 我也对已启动的活动提供弱引用数据表示担忧。 虽然它会保证(虽然?),但它在初始启动时可用,它不会在破坏后的Activity的重新创建(onCreate(notNull))时不可见。 – kaay 2011-11-21 10:30:37