2010-11-11 1 views
2

Меня особенно интересует следующее предложение от official android FAQ.HashMap of WeakReferences для передачи данных между действиями

HashMap лучше из WeakReferences на объекты

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

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

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

  • получающей служба имеет статический HashMap объектов.

    public static HashMap<Long, Object> parameters = new HashMap<Long, Object>(); 
    
  • код представляемых части (задание А)

    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)? И такой шаблон использования для передачи данных в порядке или вы предпочитаете что-то другое.

ответ

5

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

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

И такой шаблон использования для передачи данных в порядке или вы предпочитаете что-то еще.

Я предпочитаю передавать простые данные только между действиями. Все, что не является примитивным (или поставляемым системой Parcelable, как PendingIntent), должно рассматриваться как часть модели данных и должно управляться как таковое. Here is a blog post, где я расскажу подробнее.

+0

Tnx. Итак, каким будет предпочтительный способ передачи массива объектов пользовательского типа из активности в службу (массив данных передается службе, так как оттуда он загружается на онлайн-сервер). – Igor

+0

@humus: Как объекты. Привяжите к службе с помощью 'bindService()', и вы можете определить любой API, который вы хотите. Вот пример проекта, который использует службу для предоставления моста веб-службе, передает «Местоположение» в службу и возвращает «ArrayList ': https: // github.com/commonsguy/cw-android/tree/master/Service/WeatherAPI/ – CommonsWare

+0

@CommonsWare «никогда не собирать мусор» - если мы не делаем это вручную в запущенной деятельности, когда это заканчивается, или сразу после получения данных. Есть ли что-то не так с таким подходом, по сравнению с опорой на автоматическую сборку (не считая, на данный момент, почти необходимость вручную перерабатывать растровые изображения, если мы их передаем)? У меня также есть проблемы с доступностью данных с слабой ссылкой к запущенной деятельности. Хотя он будет (это гарантировано, хотя?) Будет доступен при первоначальном запуске, он не будет находиться на отдыхе активности (onCreate (notNull)) после уничтожения, пока не будет видимым. – kaay

Смежные вопросы