как правильно упаковать List <Hashtable <String, List <String >>> в Намерение на трансляцию?

1

На 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, чтобы использовать это. Правильно ли это делать? Или есть более простой метод?

  • 1
    О Боже ... Беги! List <Hashtable <String, List <String >>> .. :-P
Теги:
broadcastreceiver
android-intent

2 ответа

2
Лучший ответ

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

  • 0
    спасибо, с помощью ArrayList я смог передать его в putExtra () без дополнительной работы
  • 1
    Пожалуйста, имейте в виду, что использование сериализации действительно дорого. Как говорится в документации, это настоятельно не рекомендуется.
0

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

Я положил 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, должен находиться в одном процессе, только классы в одном процессе могут обмениваться данными в кучу.

  • 2
    Если вы делаете это, добрый господин, просто не посылайте трансляцию. Какой в этом смысл? Никто, но тот же процесс не может использовать трансляцию; просто есть локальный объект, на который вы делаете обратный вызов.
  • 0
    @hackbod Как я уже упоминал в своем ответе, я не думаю, что это хороший способ передать сложный объект через Intent. Но если вы просто хотите передать объект только в своем приложении, и действительно сложно сделать ваш объект Parcelable (например, List<Hashtable<String,List<String>>> ), то я думаю, что вы можете рассмотреть это решение.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню