Android: передача хэш-карты между действиями

У меня есть карта между строкой и объектом класса. Я заполняю эту карту в Activity1, и я хотел бы передать ее в Activity2.

public class NEW extends Activity { public class data { String name; float value; .... etc } ...... static Map<String, data> data_map = new HashMap<String, data>(); ..... } 

Solutions Collecting From Web of "Android: передача хэш-карты между действиями"

Я предполагаю, что у вас есть обе виды деятельности (назовите их A и B). В этом случае просто поместите карту в общедоступную статическую переменную и получите доступ к ней из B через A.data_map.

[Обновить]

Для всех замедленных взглядов обратите внимание на раздел « Часто задаваемые вопросы по приложениям Android » «Как передавать данные между действиями / службами в одном приложении?». Решение, которое я рекомендую, точно такое же, как …

Публичное статическое поле / метод

Альтернативный способ сделать данные доступными для всех видов деятельности / служб – использовать публичные статические поля и / или методы. Вы можете получить доступ к этим статическим полям из любого другого класса вашего приложения. Чтобы совместно использовать объект, действие, которое создает ваш объект, устанавливает статическое поле, указывающее на этот объект, и любое другое действие, которое хочет использовать этот объект, просто обращается к этому статическому полю.

Да, есть предостережения для этого решения, но с ограниченной информацией, представленной OP, мы не можем предположить, что этот метод не будет работать.

Лучший способ сделать это – вы можете выразить свои данные в примитивах, поддерживаемых Bundle, поэтому его можно поместить в Intent, который вы отправляете с помощью методов Intent.putExtra (). (ЗА ИСКЛЮЧЕНИЕМ для использования Serializable, который чрезвычайно медленный и неэффективный.)

Однако вы не можете этого сделать, потому что (a) вы используете карту и (b) ваша карта содержит пользовательский тип данных.

Формально правильное решение этой проблемы заключается в написании пользовательского класса Parcellable, который заботится о сортировке / разборке структуры данных. Я нарисую код здесь, хотя это может быть не совсем правильно:

 import android.os.Parcel; import android.os.Parcelable; import android.os.Parcelable.Creator; public class MyData implements Parcelable { HashMap<String, data> data_map = new HashMap<String, data>(); public MyData() { } public int describeContents() { return 0; } public void writeToParcel(Parcel dest, int parcelableFlags) { final int N = data_map.size(); dest.writeInt(N); if (N > 0) { for (Map.Entry<String, data> entry : data_map.entrySet()) { dest.writeString(entry.getKey()); data dat = entry.getValue(); dest.writeString(dat.name); dest.writeFloat(dat.value); // etc... } } } public static final Creator<MyData> CREATOR = new Creator<MyData>() { public MyData createFromParcel(Parcel source) { return new MyData(source); } public MyData[] newArray(int size) { return new MyData[size]; } }; private MyData(Parcel source) { final int N = source.readInt(); for (int i=0; i<N; i++) { String key = source.readString(); data dat = new data(); dat.name = source.readString(); dat.value = source.readFloat(); // etc... data_map.put(key, dat); } } } 

Обратите внимание, что когда у вас есть пользовательская структура данных, например, ваш класс данных, она может быть более чистой, чтобы также сделать ее Parcellable, поэтому она знает, как читать / писать ее содержимое на посылке, а код здесь просто вызовет .writeToParcel ( …) и метод .readFromParcel (…), вместо того, чтобы знать подробности его содержимого. Таким образом, когда вы добавляете новые поля в «данные», вы не забываете также обновлять этот другой код маршаллинга, чтобы узнать о них.

Я бы предложил использовать Intents, которые работают как для статических, так и для суровых объектов (пока они реализуют Serializable). Создайте пользовательское намерение для своего приложения, а затем передайте свой HashMap (а не карту, которая не реализует Serializable!) В качестве дополнительных данных:

 Intent act2 = new Intent(Activity2.SHOW_ME); act2.putExtra("data", data_map); 

Затем в Activity2 вы можете вызвать getIntent() и проверить через Intent.getAction().equals(Activity2.SHOW_ME) ли вы тем, кто вызвал вашу активность. Если это так, вы можете получить доступ к своим дополнительным данным с помощью

 Intent caller = getIntent(); if (caller.getAction().equals(Activity2.SHOW_ME)) { Map<String, NEW.data> data_map = (Map<String, NEW.data>)caller.getExtras().get("data"); } 

Надеюсь, я все правильно набрал;) Это предполагает, что ваша строка действия Intent хранится как static final string SHOW_ME = "yourpackage.yourname"; В Activity2.

Если вам нужно дополнительное разъяснение, добавьте комментарий.

Вы можете инкапсулировать свои данные в Bound Service, как описано в этом документе:

http://developer.android.com/guide/topics/fundamentals/bound-services.html

Не забудьте добавить свой сервер в файл манифеста.

Это решение имеет то преимущество, что вы отключите свои данные от вашего пользовательского интерфейса, что в конечном итоге приведет к более удобному дизайну.

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

Создайте новый Java-файл, который будет глобальным для всего приложения.

Шаг 1 :

 public class GlobalClass extends android.app.Application { public static Map<String, NEW.data> data_map = new Map<String, NEW.data>(); } 

Шаг 2 :

После этого зарегистрируйте этот «GlobalClass» в AndroidManifest.xml

 <application android:name=".GlobalClass" android:icon="@drawable/ic_launcher" android:label="@string/app_name" > </application> 

Шаг 3 :

Теперь вы можете использовать эту карту в любом месте своего приложения.

 @Override protected void onCreate(Bundle icicle) { GlobalClass global = (GlobalClass)getApplication(); Map<String, NEW.data> my_map_data = global.data_map; } 

Эти шаги могут быть полезны для вас …