HashMap erzeugen - dauerhaft im Speicher halten?

  • Antworten:8
Ben Becker
  • Forum-Beiträge: 209

23.09.2011, 12:45:01 via Website

Hiho!
Ich habe eine Hashmap. Zur Zeit lasse ich diese immer erzeugen wenn sie benötigt wird. Das ist natürlich unschön. Am besten wäre ja, ich habe ein Objekt was die ganze Laufzeit der App da ist und dann muss die HashMap ja nicht immer neuerzeugt werden. Die App enthält aber mehrer Activities. Daher weiß ich noch nicht wie ich das machen kann.
Ich habe eine Hilfsklasse die Stellt die HashMap und die GetMethoden zur Verfügung.
Das hier ist meine Hilfsklasse. Und da würde ich halt ungern immer das Objekt immer wieder zu erstellen wenn ich eine neue Activitie starte. Oder ist das nicht schlimm? Also Performancetechnisch. Die HashMap wird eine Größe von 100 Einträgen haben.

1mport java.util.HashMap;
2
3import org.json.JSONArray;
4
5import android.app.Activity;
6import android.content.SharedPreferences;
7
8
9public class DataName_ID {
10 private HashMap<Integer, String> hash_data = new HashMap<Integer, String>();
11 private HashMap<Integer, String> hash_land = new HashMap<Integer, String>();
12
13 public DataName_ID(Activity activity){
14 DataHashMapErzeugen(activity);
15 LandHashMapErzeugen(activity);
16 }
17
18 public String getDataName(int id){
19 return hash_data.get(id);
20 }
21
22 private void DataHashMapErzeugen(Activity activity){
23 SharedPreferences settings = activity
24 .getSharedPreferences("Daten", 0);
25 String text = settings.getString("daten", "0");
26
27 if(!text.equals("0")){
28 try {
29 JSONArray Jarr = new JSONArray(text);
30 for (int i = 0; i < Jarr.length(); i++) {
31 hash_liga.put(Jarr.getJSONObject(i).getInt("id_data"), Jarr.getJSONObject(i).getString("data_name_de"));
32 }
33 } catch (Exception e) {
34 e.printStackTrace();
35 }
36 }
37 }
38
39 private void LandHashMapErzeugen(Activity activity){
40 SharedPreferences settings = activity
41 .getSharedPreferences("Daten", 0);
42 String text = settings.getString("daten", "0");
43
44 if(!text.equals("0")){
45 try {
46 JSONArray Jarr = new JSONArray(text);
47 for (int i = 0; i < Jarr.length(); i++) {
48 hash_land.put(Jarr.getJSONObject(i).getInt("id_data"), Jarr.getJSONObject(i).getString("land_name_de"));
49 }
50 } catch (Exception e) {
51 e.printStackTrace();
52 }
53 }
54 }
55}

Antworten
Markus B.
  • Forum-Beiträge: 636

23.09.2011, 13:26:28 via Website

Hallo,
schau dir mal das "Singleton Pattern" an. Damit kannst du dein Problemchen umgehen.

Gruß,
Markus

Ben Becker

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

23.09.2011, 13:38:57 via Website

Jupp, Singleton ist der einfachste Weg.

Man sollte sich aber dessen bewusst sein, dass die HashMap dann als static deklariert wird und damit noch eine gewisse Zeit im Speicher bleibt, auch wenn man die App komplett beendet.
Wenn du die App also nach 5 Minuten nochmal startest, sieht sie immernoch die Instanz der HashMap die vom letzten App Start angelegt wurde.
Das ist nicht unbedingt ein Problem...sollte man nur im Hinterkopf behalten :)

— geändert am 23.09.2011, 13:39:07

Antworten
Ben Becker
  • Forum-Beiträge: 209

23.09.2011, 13:43:25 via Website

Danke, ja das ist super sinnvoll. Wusste doch das es da was gibt. :) Hatte ja schon einen Java Lehrgang, aber man lernt nur durch üben, üben, üben und nochmals üben und da bin ich gerade dabei.
Daher noch eine Frage zum Singelton. Macht das ein Problem wenn ich da eine activity übergebe? Also bis jetzt funktioniert es aufjedenfall ohne Probleme.

Antworten
Markus B.
  • Forum-Beiträge: 636

23.09.2011, 13:49:25 via Website

Hi,
du kannst da sicher eine Activity übergeben. Das sind ja alles nur Objekte. Du musst nur bedenken das die Activity dann mit einem bestimmten Stand in das Singelton geschrieben wird. Evtl. solltest du hier noch mal überlegen warum du im Singelton die entsprechende Activity brauchst. Das Singelton ist ohne sicher einfacher zu handeln :)

Gruß,
Markus

Antworten
Ben Becker
  • Forum-Beiträge: 209

23.09.2011, 13:52:36 via Website

Ich brauche die Activity um auf die SharedPreferences zugreifen zu können. In der werden meine Daten gespeichert.

Antworten
Markus B.
  • Forum-Beiträge: 636

23.09.2011, 13:56:53 via Website

Dann übergibt einfach beim initialisieren des Singeltons das Sharedpreferences-Object mit. Dann kommst du von der Activity weg und kannst da auch eventuelle Context-Probleme.

Gruß,
Markus

Ben Becker

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

23.09.2011, 14:03:07 via Website

Auf jeden Fall weg von der Activity.
Am besten würde ich garnichts aus dem App Lifecycle in einem Singleton speichern, sondern die SharedPrefs einfach immer übergeben.
Sonst kann es sein, dass du (im Szenario, was ich weiter oben beschrieben habe) mit einer neuen Activity auf Objekte zugreifst, die mit dem Schliessen der alten Activity "entwertet" wurden.

Die DalvikVM reagiert da teilweise ziemlich allergisch drauf und die Fehler, die man dadurch bekommt sind echt schwer zu debuggen.

Ben Becker

Antworten
Ben Becker
  • Forum-Beiträge: 209

23.09.2011, 14:26:30 via Website

Ok das habe ich dann jetzt gemacht. Damit ist die Activity ganz draussen.

Antworten