как правильно упаковать список> В Намерении на трансляцию? - PullRequest
1 голос
/ 16 июля 2011

На Android я пытаюсь отправить пользовательское широковещательное сообщение, используя пользовательские Intent и BroadcastListeners. У меня есть некоторые пользовательские данные в формате:

List<Hashtable<String,List<String>>> data;

При попытке использовать:

intent.putExtra("mydata", data);

Я получаю ошибку:

The method putExtra(String, boolean) in the type Intent is not applicable for the  arguments (String, List<Hashtable<String,List<String>>>)

Глядя на класс Intent, есть несколько открытых методов, которые перегружают putExtra (). Однако, похоже, никто не соответствует данным, которые я пытаюсь отправить.

Кажется, есть довольно общий метод

putExtra(String name, Bundle value)

Однако я не уверен, как преобразовать мои данные в Bundle, чтобы использовать это. Это правильная вещь? Или есть более простой способ?

Ответы [ 2 ]

2 голосов
/ 16 июля 2011

Вы хотите, чтобы Serializable для putExtra(String name, Serializable s) версии.Однако List - это интерфейс, который не расширяет Serializable.Попробуйте объявить его как ArrayList.

0 голосов
/ 16 июля 2011

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

Я помещаю Map в глобальный одноэлементный объект, ключ Map равен String, Map сохранит объект, который я хочу передать в Intent, вместо помещения объекта в Intent, я положил ключ String в Intent. В Activity (или Службе ...), куда было передано намерение, я получаю ключ от Intent, а затем получаю объект, который мне действительно нужен, от Mao.

Может быть, этого недостаточно, вот псевдокод:

public void sendIntent() {
    Object data; // the object you want to pass through Intent
    Map<String, Object> globalMap = getMyGlobalMap();
    String uid = UUID.randomUUID().toString();
    globalMap.put(uid, data);
    intent.putExtra(EXTRA_OBJECT_UID, uid);
}

public void receiveIntent() {
    String uid = intent.getStringExtra(EXTRA_OBJECT_UID);
    Object data = getMyGlobalMap().get(uid); // Here is your data object.
}

Обратите внимание, что, поскольку вы помещаете глобальную карту в одноэлементный объект, вы можете удалить объект из Map, когда закончите с ним, поскольку карта будет существовать до тех пор, пока ваше приложение работает, вы можете не хочу оставлять какие-то бесполезные предметы и позволять им забирать вашу драгоценную память.

Обновление
Еще одна очень важная вещь: компонент, который отправляет Intent, и компонент, который получит Intent, должны находиться в одном процессе, только классы в одном и том же процессе могут совместно использовать данные в куче.

...