HashMap из WeakReferences для передачи данных между действиями - PullRequest
2 голосов
/ 11 ноября 2010

Меня особенно интересует следующее предложение из официального FAQ по Android .

Хэш-карта слабых ссылок на объекты

Вы также можете использовать HashMap WeakReferences для объектов с длинными ключами. Когда действие хочет передать объект другому действию, оно просто помещает объект на карту и отправляет ключ (который является уникальным длинным, основанным на счетчике или отметке времени) получателю действия с помощью намерений. Операция получателя получает объект с помощью этого ключа.

Я не нашел способа, как правильно это реализовать. И я не уверен, почему WeakReferences здесь предпочтительнее, и почему бы не использовать жесткие ссылки.

Моя реализация (я хочу отправить экземпляр класса XY из действия A в службу B ):

  • получающая служба имеет статическую хэш-карту объектов.

    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 Ответ

5 голосов
/ 11 ноября 2010

Почему я должен использовать слабые ссылки здесь (как предложено в FAQ)?

Потому что у вас утечка памяти.Все, что вы вставляете в эту статическую HashMap, никогда не собирается сборщиком мусора.

И это такой шаблон использования для передачи данных, или вы предпочитаете что-то еще.Я предпочитаю только передавать простые данные между действиями.Все, что не является примитивом (или системным Parcelable, таким как PendingIntent), должно рассматриваться как часть модели данных и должно управляться как таковое. Вот сообщение в блоге , где я более подробно расскажу.

...