sharedPreferences verschwinden

  • Antworten:50
fileerror
  • Forum-Beiträge: 116

16.12.2014, 09:40:45 via Website

Hallo,

seit dem ich ziemlich viele Werte in den sharedPreferences speichere (ca. 50 Werte für Button an/aus, Schalterstellungen, Zeiten usw.) ist alles, wenn ich die App paar Minuten aus mache, wieder auf Ausgangszustand :(
So ca. 1 - 2 Minuten bleiben die Werte gespeichert und werden wieder geladen. Das kann ja eigentlich nur an der Menge liegen, da es erst so ist, seit dem es so viele sind. Als es noch nicht so viel war, hatte ich keine Probleme. Vielleicht ist das Problem ja bekannt:

Ich hoffe da hat jemand Erfahrung.

Gruß fileerror

— geändert am 16.12.2014, 09:41:21

Antworten
Martin
  • Forum-Beiträge: 756

16.12.2014, 09:46:36 via App

Beendest du die App richtig? Könnt mir jetzt grad nur vorstellen, dass du nicht in die .apply() kommst und nach einer Zeit der Cache gelöscht wird...

Antworten
fileerror
  • Forum-Beiträge: 116

16.12.2014, 09:50:30 via Website

Also ich speichere alles bei onPause().Eigentlich sollte das doch i.O. sein. Dort alles rein - und dann editor.apply();

@Override
protected void onPause() {
super.onPause();

    editor.clear();

    editor.putInt("runTime", runTime);
    editor.putBoolean("checked", checked);

    for (int i = 0; i < 7; i++) {
        startH = "startHour" + String.valueOf(i);
        startM = "startMinute" + String.valueOf(i);
        stopM = "stopHour" + String.valueOf(i);
        stopM = "stopMinute" + String.valueOf(i);
        editor.putInt(startH, startHour[i]);
        editor.putInt(startM, startMinute[i]);
        editor.putInt(stopH, stopHour[i]);
        editor.putInt(stopM, stopMinute[i]);

        tb = "checked" + String.valueOf(i);
        editor.putBoolean(tb, tBChecked[i]);
    }
    editor.apply();
}

— geändert am 16.12.2014, 09:56:35

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

16.12.2014, 10:21:28 via Website

Sicher, dass die Werte in den sharedPrefs fehlen und Du nicht einfach nur vergessen hast die Oberfläche wiederherzustellen, nachdem die App vom System beendet und neu gestartet wird? Das würde erklären warum das nach Minimieren/Wiederherstellen passiert.
An der Menge liegt das GARANTIERT nicht.

Einfacher Test dafür: Dreh das Gerät. Wenn die Werte dann auch verschwinden, musst an deine Oberflächenlogik nochmal ran.
Im Debugger kannst Du auch mit Hilfe von Expressions gucken welche Werte die sharedPrefs enthalten.

Antworten
fileerror
  • Forum-Beiträge: 116

16.12.2014, 10:28:29 via Website

Das mit den Expressions kling gut, nur wo finde ich das? Bin gerade im Dubugger, finde das aber nicht.

Antworten
fileerror
  • Forum-Beiträge: 116

16.12.2014, 10:31:27 via Website

OK habs nur steht da nichts.

Antworten
fileerror
  • Forum-Beiträge: 116

16.12.2014, 10:39:04 via Website

Oh danke damit habe ich noch keine Erfahrung, damit muss ich mich wohl erst mal beschäftigen.

Antworten
fileerror
  • Forum-Beiträge: 116

16.12.2014, 10:43:55 via Website

Nur komisch, dass es funktioniert hat, bevor die Schleife drin war. Und wenn ich mit if(prefs.contains("wert") prüfe, dann wertet er nach paar Minuten auch false. :(

Antworten
fileerror
  • Forum-Beiträge: 116

16.12.2014, 11:02:58 via Website

Ich poste dann mal den Code, wenn der Computer frei ist. Mich hat nur stutzig gemacht, dass noch für eine Weile alles wieder kommt. Sonst hätte ich schon lange nach einem Logik-Problem gesucht. Aber wenn es so ist, dass Android die App erst ein, zwei Minuten nach dem Schließen endgültig beendet, dann würde es schon einfacher zu verstehen sein.

— geändert am 16.12.2014, 11:04:04

Antworten
fileerror
  • Forum-Beiträge: 116

16.12.2014, 12:20:24 via Website

So: in onCreate lasse ich diese Methode ausführen:

private void setPreferences() {

    if (prefs.contains("notFirstTime")) {
        checked = prefs.getBoolean("checked", checked);

        for (int i = 0; i < 7; i++) {
            startH = "startHour" + String.valueOf(i);
            startM = "startMinute" + String.valueOf(i);
            stopM = "stopHour" + String.valueOf(i);
            stopM = "stopMinute" + String.valueOf(i);
            startHour[i] = prefs.getInt(startH, startHour[i]);
            startMinute[i] = prefs.getInt(startM, startMinute[i]);
            stopHour[i] = prefs.getInt(stopH, stopHour[i]);
            stopMinute[i] = prefs.getInt(stopM, stopMinute[i]);

            tb = "checked" + String.valueOf(i);
            tBChecked[i] = prefs.getBoolean(tb, tBChecked[i]);
        }
    } else {
        editor.clear();

        editor.putBoolean("notFirstTime", true);
        editor.putBoolean("checked", false);

        for (int i = 0; i < 7; i++) {

            checked = false;

            startHour[i] = 7;
            startMinute[i] = 0;
            stopHour[i] = 14;
            stopMinute[i] = 0;

            tBChecked[i] = false;

            startH = "startHour" + String.valueOf(i);
            startM = "startMinute" + String.valueOf(i);
            stopM = "stopHour" + String.valueOf(i);
            stopM = "stopMinute" + String.valueOf(i);
            editor.putInt(startH, 7);
            editor.putInt(startM, 0);
            editor.putInt(stopH, 14);
            editor.putInt(stopM, 0);

            tb = "checked" + String.valueOf(i);
            editor.putBoolean(tb, false);
        }
        editor.apply();
    }

}

Das heiß wenn der Wert notFirstTime vorhanden ist wird geladen, wenn nicht, dann alles auf Default-Werte gesetzt und gespeichert.
Bei jedem Speichern wird der Wert notFirstTime (nur als Kontrollwert) mit gespeichert, also sollte nur beim ersten Start alles auf Default gesetzt werden.

Und in onPause:

@Override
protected void onPause() {
super.onPause();

    editor.clear();

    editor.putBoolean("notFirstTime", false);
    editor.putBoolean("checked", checked);

    for (int i = 0; i < 7; i++) {
        startH = "startHour" + String.valueOf(i);
        startM = "startMinute" + String.valueOf(i);
        stopM = "stopHour" + String.valueOf(i);
        stopM = "stopMinute" + String.valueOf(i);
        editor.putInt(startH, startHour[i]);
        editor.putInt(startM, startMinute[i]);
        editor.putInt(stopH, stopHour[i]);
        editor.putInt(stopM, stopMinute[i]);

        tb = "checked" + String.valueOf(i);
        editor.putBoolean(tb, tBChecked[i]);
    }
    editor.apply();
}

Aber er setzt immer wieder die nach 1, 2 Minuten die Default-Werte.

So richtig steige ich nicht dahinter.

— geändert am 16.12.2014, 12:21:35

Antworten
fileerror
  • Forum-Beiträge: 116

16.12.2014, 12:26:15 via Website

Scheinbar geht es jetzt so. Noch ist alles da, dabei habe ich nur den Code bissel umgestellt. :(

von:

if(!prefs.contains***)
set default

else
load

zu :

if(prefs.contains***)
load

else
set default

Da war wohl doch irgend ein dummer Logikfehler drin.

— geändert am 16.12.2014, 12:31:13

Antworten
fileerror
  • Forum-Beiträge: 116

16.12.2014, 12:35:48 via Website

Danke für die Hilfe, das hat mich echt Nerven gekostet. Noch eine Frage:

Ist das so i.O. alles in onPause auf einmal zu speichern, oder sollte man jede Veränderung sofort in die sharedPrefs speichern?

Gruß fileerror

Antworten
pepperonas
  • Forum-Beiträge: 434

16.12.2014, 13:12:59 via Website

Der Aufruf von onPause wird von Android garantiert (onStop() nicht), somit reicht es vollkommen aus in onPause die Werte zu speichern.

Open Source

Antworten
fileerror
  • Forum-Beiträge: 116

16.12.2014, 13:21:04 via Website

Ok alles klar. ;)

— geändert am 16.12.2014, 13:21:25

Antworten
fileerror
  • Forum-Beiträge: 116

16.12.2014, 13:41:57 via Website

So Kommando zurück. Es ist wieder alles weg. Mit genau dem Code von oben. Hat diesmal nur bissel länger gedauert.
:(

Hab jetzt auch mal beim Laden des IF ELSE raus, um so oder so zu laden! Dann steht alles nach ner Zeit auf 0, also scheint da wirklich nichts zu sein.

— geändert am 16.12.2014, 13:43:33

Antworten
fileerror
  • Forum-Beiträge: 116

16.12.2014, 14:17:47 via Website

Jetzt habe ich in die Fallunterscheidung einen Toast eingebaut, der mir sagt ob geladen wurde.

private void setPreferences(View v) {

    SharedPreferences prefs = getPreferences(Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = prefs.edit();

    if (prefs.contains("notFirstTime")) {
        checked = prefs.getBoolean("checked", checked);

        for (int i = 0; i < 7; i++) {
            startH = "startHour" + String.valueOf(i);
            startM = "startMinute" + String.valueOf(i);
            stopM = "stopHour" + String.valueOf(i);
            stopM = "stopMinute" + String.valueOf(i);
            startHour[i] = prefs.getInt(startH, startHour[i]);
            startMinute[i] = prefs.getInt(startM, startMinute[i]);
            stopHour[i] = prefs.getInt(stopH, stopHour[i]);
            stopMinute[i] = prefs.getInt(stopM, stopMinute[i]);

            tb = "checked" + String.valueOf(i);
            tBChecked[i] = prefs.getBoolean(tb, tBChecked[i]);
            toast = Toast.makeText(v.getContext(), "wurde erfolgreich geladen", Toast.LENGTH_SHORT);
            toast.setGravity(Gravity.TOP, 0, 65);
            toast.show();
        }
    } else {
        //editor.clear();

        editor.putBoolean("notFirstTime", true);
        editor.putBoolean("checked", false);

        for (int i = 0; i < 7; i++) {

            checked = false;

            startHour[i] = 7;
            startMinute[i] = 0;
            stopHour[i] = 14;
            stopMinute[i] = 0;

            tBChecked[i] = false;

            startH = "startHour" + String.valueOf(i);
            startM = "startMinute" + String.valueOf(i);
            stopM = "stopHour" + String.valueOf(i);
            stopM = "stopMinute" + String.valueOf(i);
            editor.putInt(startH, 7);
            editor.putInt(startM, 0);
            editor.putInt(stopH, 14);
            editor.putInt(stopM, 0);

            tb = "checked" + String.valueOf(i);
            editor.putBoolean(tb, false);
        }
        editor.apply();
        toast = Toast.makeText(v.getContext(), "konnte nicht geladen werden", Toast.LENGTH_SHORT);
        toast.setGravity(Gravity.TOP, 0, 65);
        toast.show();
    }
}

Und: wenn ich eine Zeit vergehen lasse, oder das Handy reboote kommt: "konnte nicht geladen werden".
Wenn ich nicht allzu lange warte kommt: wurde erfolgreich geladen. Total verrückt. (silly)

Antworten
fileerror
  • Forum-Beiträge: 116

16.12.2014, 15:52:25 via Website

SO. Wenn ich nur meine 8 Statuswerte für die Schalter speichere funtioniert alles. Sobald die 28 int-Werte dazu kommen gehts nicht mehr.
Scheinebar sind da die Sharedprefs doch überfordert oder ich weiß es auch nicht.

Gruß fileerror

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

16.12.2014, 16:58:43 via Website

Bittte zeige nochmal deine aktuellen Code :)

PS: if (prefs.contains("notFirstTime")) { //hier prüfst du zwar ob der key existiert aber nicht welchen Wert diese hat, denn wenn du sie true setzt exisitert der Key immernoch`

Falls du wissen wilst ob das speichern geklappt hat dann nimmst du statt apply():

commit() returns true if the save works, false otherwise

PPS: Wass willst du überhaupt mit diesem komplizierten Code erreichen?
Neheme ich das richtig an dass es um eine Time Range ( von 7:00 bis 14:00 Uhr) geht?
Wenn ja mach es doch bitte nicht so kompliziert!

LG Pascal

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
fileerror
  • Forum-Beiträge: 116

16.12.2014, 17:16:24 via Website

Wieso ist es kompliziert? Wie geht es einfacher? Der Code steht oben. Mit if(prefs. contains) prüfe ich doch nur ob Speicherdaten vorhanden sind, egal ob true oder false. Ich könnte das auch mit jedem andern Wert aus meinen Daten machen.
Habe das isFirstTime nur als Kontrollwert mit eingebaut eingebaut.

Gruß fileerror

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

16.12.2014, 17:26:19 via Website

Ich nehme es asl Kompliziert an denn du könntest cuh einfach dei 2 Steiten als String in den prefs speichern, dann die Zeiten laden in ein DateTime Objekt parsen und dieses dann auf aktivität in einer IF überprüfen.

LG

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
fileerror
  • Forum-Beiträge: 116

16.12.2014, 17:34:22 via Website

Naja irgendwie klingt DAS für mich kompliziert ;). An dem Problem sollte es auf jeden Fall nichts ändern.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

16.12.2014, 17:57:36 via Website

Na ja doch du musst nur 2 Strings speichern und dann ist das Problem gelöst ;)
BSP:

/// Beim Speichenn
prefsEditor.putString("time1","7:00:00"); //Startzeit 7 Uhr
prefsEditor.putString("time2","14:00:00"); // Endzeit 14 uhr


//Beim lesen und verwenden:
String time1 = prefs.getString("time1",null);
String time2 = prefs.getString("time2",null); //evntl. auf NULL prüfen oder anderen Standartwert nemen.

   Date time1_date = new SimpleDateFormat("HH:mm:ss").parse(time1);
   Date time2_date = new SimpleDateFormat("HH:mm:ss").parse(time2);

//Hier jetzt noch prüfen ob die Aktuelle Zeit innerhalb der beiden Zeiten liegt.

Tipp: http://stackoverflow.com/questions/14069940/android-how-to-determine-of-time-object-is-between-two-other-time-objects

LG Pascal

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
fileerror
  • Forum-Beiträge: 116

16.12.2014, 18:10:37 via Website

Hmm naja ich brauch doch aber für jeden Wochentag zwei Zeiten und die 7, 14 sind ja nur zum Default-Werte setzen. (Für den ersten Start)
Ich könnte auch einfach die Variablen von vorneherein einfach auf 7, 14 setzen, aber das wäre Unsinn. Außerdem lassen sich die Int-Werte direkt auf ein calendar-Objekt anwenden.

Bin da auch noch nicht so der Pro ;)

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

16.12.2014, 18:17:53 via Website

Willst du jeden Wochentag andere Zeiten?
Entweder du löst das über einzelne Variablen in den prefs oder du machst 2 String arrays draus bei denen die Position der genannte Tag ist.
Musst du entscheiden.
Die Methode über viele Schleifen ist (mir) jedenfalls zu komliziert dass lässt sich einfacher und mit besserem Konzept umsetzen.

Tipp zum parsen in eine Calendar Object: http://stackoverflow.com/questions/5301226/convert-string-to-calendar-object-in-java

LG

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
fileerror
  • Forum-Beiträge: 116

16.12.2014, 18:29:57 via Website

Naja klar für jeden Tag andere Zeiten sonst wären die Schleifen ja Quatsch ;) Denke mit ner Schleife geht das am schnellsten. Das Problem
ist ja auch ein anderes, und würde sich dadurch denke ich nicht lösen. Wahrscheinlich muss ich die Zeiten doch noch in ein FileOutputStream packen, womit ich mich noch gar nicht beschäftigt habe :( Aber schon komisch, dass nur ich dieses Problem mit den SharedPrefs habe.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

16.12.2014, 18:31:23 via Website

Dann beschreibe doch dein Problem, vlt gibt es da auch andere lösungen zudem sah mir dein Code jetzt nicht gerade duchdacht aus.:O

LG

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
fileerror
  • Forum-Beiträge: 116

16.12.2014, 18:40:34 via Website

Hast du den Thread nicht gelesen?

Antworten
fileerror
  • Forum-Beiträge: 116

16.12.2014, 18:43:51 via Website

Und warum "undurchdacht"? Ist doch nur ne Schleife, die paar Werte speichert. Oder auch nicht....

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

16.12.2014, 18:54:54 via Website

Doch aber ich verstehe dein Problem nicht..
Du hast einen Service der der irgendwas machen soll (was im Deteils lasse ich weg ist für den Teil den du gerade programmierst unwichtig)
Dann willst du dass der service zwischen uhrzeit x und uhrzeit y eines Tages funktioniert.
Jeder Tag hat andere Funktionszeiten, die du irgendwo definieren musst.
Du hast dich nun für Definitionen für die Shared Preferences entschieden.(gibt auch noch andere Speichermöglichkeiten wie eine DB oder einen normalen File etc.)

Ich sehe jetzt mehrer möglichkeiten:
1. Du erstellst für jeden Tag eine (oder auch 2) SharedPreferences Variablen indenen du dann die Zeit speicherst und wieder ausliest.
2. Du hast 2 Sharedprefs Variablen als Array im 1. stehen die Startzeiten und im 2. Die endzeiten. Über die Postition bekommst du die beiden Zeiten (Start und End) aus beiden Arrays. Diese kannst du dann weiterverarbeiten.

Ich finde es wenig sinvoll und unübersichtliich 28 Prefs variablen zu haben und diese Managen zu müssen.
Da habe ich lieber ein oder zwei Arrays mit denen ich arbeite.(Der Code ist damit auch kürzer und einfacher zu verstehen)

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
fileerror
  • Forum-Beiträge: 116

16.12.2014, 19:04:07 via Website

Das sind doch Arrays (silly)... Und über die Schleife speichere sie in den SharedPrefs. Oder kann man ein Array direkt als ganzes speichern? Wenn dann wusste ich das nicht. Und beim Auslesen werden die Daten doch auch wieder in Arrays verpackt. Das Problem ist doch, dass die Daten verschwinden. Bitte lies den Anfang.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

16.12.2014, 19:11:38 via Website

ich speichere Array als ganzes, ist gleich einfacher, aber dies geht nur mit einem Trick und nur als String.
Hier mal ein Codeausschnitt aus meiner algemeinen SharedPreferences ansteuer Klasse:

/**
 * Schreibt ein Array in die SharedPrefenences
 * @param key Preference Key
 * @param value Array Value
 */
public  static void writeArrrayToPreferences(String key,String[] value){
      SharedPreferences.Editor spe = PreferenceManager.getDefaultSharedPreferences(Globals.ct).edit();
      StringBuilder sb = new StringBuilder();
      for (int i = 0; i < value.length; i++) {
          sb.append(value[i]).append(",");
      }
      spe.putString(key, sb.toString());



    spe.commit();


}

/**
* Gibt ein string Array aus den Shared Preferences zurück.
* @param key Key des Arrays
* @return Array
*/
public static String[] getStringArrayFromPreferneces(String key) {
String result = PreferenceManager.getDefaultSharedPreferences(context).getString(key, "");

String[] arr = result.split(",");
return arr;

/@ToDO auf mögliche fehlwerte prüfen und si in einer catch abfangen und loggen
}

Ich trenne alle Values im Array mit einem Komma und splitte dei Werte beim lesen daran Wieder.
Einziges Problem:
Im Array darf kein einziges Komma vorkommen!
Falls das doch der Fall ist kannst du das Trennzeichen ja ändern.

LG

PS: Hab gleich noch meine ToDo anmerkung hinzugefügt, denn falls etwas schiefläuft wird eine exception auftreten...

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
fileerror
  • Forum-Beiträge: 116

16.12.2014, 19:19:20 via Website

Ok, das ist interessant, aber ich denke das ist bissel viel Input für mich ;).
Aber hast du eine Idee, warum nach ca. 2 Min meine SharedPrefs verschwunden sind? Wenn ich die 28 Int-Werte weg lasse, passiert es nicht. Und gespeichert wird definitiv, da ich sie ca. 2 Min nach Beenden noch laden kann. Dann irgendwann sind plötzlich alle Werte weg.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

16.12.2014, 19:47:49 via App

Ich glaube dass in deinem Code einfach Fehler drinne sind die diesen Effekt auslösen. Wenn du den Code verbessern willst am besten jede Zeile einzeln anschauen und überlegen was dein Programm in den verschiedenen Situationen macht bzw. machen soll.
So kann man einfach Fehler finden. Zudem gibt es auch noch LogCat +Debugger.
Zu dem löschen nach einer bestimmten Zeit kann ich jetzt nichts sagen

könnte sein dass du deine Prefs irgendwo überschreibst oder die variablen werden nur im Ram aber nicht in der Shared Preferences gespeichert.

— geändert am 16.12.2014, 19:48:43

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
fileerror
  • Forum-Beiträge: 116

16.12.2014, 20:08:45 via Website

Mein Gott wer hätte es gedacht: Ich glaube du hast mir da jetzt den entscheidenden Hinweis gegeben! Bei meinem String-erstellen heißen doch 2 Variablen gleich!!! Na wenn es das nicht ist. Warum denn nicht gleich so?

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

16.12.2014, 20:20:27 via Website

Siehst du geht doch :)
Beim nächsten mal den Code etwas konzentreiter duchschauen/schreiben ;)



Da deine Frage ja nun beantwortet ist kanst du ja deinen Thread auch auf beantwortet setzen (smug) [Dafür über deinem ersten Post auf "Mehr"->"Beantwortet"]

LG Pascal

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
fileerror
  • Forum-Beiträge: 116

16.12.2014, 20:30:02 via Website

Jaja einfach gesagt. Also manchmal... Das ist das Ergebnis von Copy & Paste und dann nachträglich die Variablennamen anpassen. ;)
Hab jetzt erstmal wieder alles zurück geändert. Aber denke,dass funktioniert jetzt. Würde mich sehr wundern, wenn nicht.

Warst halt zu sehr damit beschäftigt, über meinen Code zu lästern :D Spaß

Ok DANKE

Antworten
pepperonas
  • Forum-Beiträge: 434

17.12.2014, 00:37:28 via Website

Um dem Problem in Zukunft vorzubeugen...

public final class MC {

    /* APP-NAME */
    public static final String APP_NAME = "MyApp";
}

in deinen anderen Klassen kannst du nun via MC.APP_NAME auf die Variable zugreifen. Das hält den Code übersichtlich und du hast einen zentralen Ort, in dem du deine Anpassungen abstimmen kannst.
Bei größeren Projekten kannst du natürlich auch mehr von diesen Utility-Klassen anlegen um die Logik besser zu trennen...

Open Source

Antworten
fileerror
  • Forum-Beiträge: 116

18.12.2014, 08:32:45 via App

Na gut ich speichere das mal in meinen Notitzen. Hab erst im Oktober angefangen mit der Android-Java-Programmiererei, deswegen gibts da noch einige Sachen, die ich nicht weiß. ;)

Antworten
fileerror
  • Forum-Beiträge: 116

27.12.2014, 17:23:32 via App

Hallo, mal wieder ein lustiges Problem . Also eigentlich dachte ich so den Wert der gepeicherten Variable zu bekommen, nur wird manchmal unerwartet true gewertet. Jetzt konnte ich das soweit eingrenzen, dass es dann passiert, wenn die Main gerade die prefs speichert. Ich schätze, das in dieser Zeit nicht auf die prefs zugegriffen werden kann, oder? Aber wenn das so ist, verstehe ich trotzdem nicht, warum dann true gewertet wird. Scheinbar überprüfe ich da doch etwas anderes  Ich bin sehr gespannt auf die Auflösung.

Gruß fileerror

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

27.12.2014, 17:25:51 via Website

Ich habe dir hier mal die Beantwortet markierung gelöscht, damit man sieht dass der Thread aktiv ist :)

Zum Problem:
Könntest du mal den betreffenden Code Posten?

LG Pascal

LG Pascal //It's not a bug, it's a feature. :) ;)

pepperonas

Antworten
fileerror
  • Forum-Beiträge: 116

27.12.2014, 17:27:24 via App

Ok mittlerweile habe ich gemerkt es liegt wohl nicht an der Speicherei. Ich will damit entscheiden, ob mein Service startet oder nicht. Und manchmal startet er trotzdem und ich nicht nachvollziehen, wieso.

Antworten
fileerror
  • Forum-Beiträge: 116

27.12.2014, 17:28:15 via App

Ja aber leider erst nach 2200

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

27.12.2014, 17:33:28 via Website

Ok danke, ich mache hier trotzdem mal eine annahme und aus diesereine Fehleranalyse:

Nehmen wir mal an das wäre dein Code:

   public boolean appIsPurchased(){
        boolean purchased = false;
        if (sharedPrefs.getBoolean("deinKey",true)){
            purchased = true;
        }
        return purchased;
    }

In diesem Beispiel wird die funktion auch "true" zurückgeben auch wenn die Varaible deines Keys nicht gesetzt ist. Das kommt daher dass du der getBoolea Methode als 2. parameter eine boolean übergibst die zurückgegeben wird wenn kein Wert existiert.

Also wenn du das nicht willst muss deine Zeile so sein:

  if (shredPrefs.getBoolean("deinKey",false)){ //<-- nun ist der Standart Wert false.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
fileerror
  • Forum-Beiträge: 116

27.12.2014, 17:43:18 via Website

Ah danke das klingt schon mal gut. Also ich erklärs trotzdem mal. Ich habe im broadcastReceiver den Intent Filter USER_PRESENT. Der soll aber nicht immer anspringen, nur wenn besagte Variable true ist. Und aus irgend einem Grund startet der Service manchmal unkontrolliert, . z. B. jetzt eben, obwohl ich das Handy schon 10 Minuten an habe. Ich ändere das dann erstmal und mal sehen, wie es sich dann verhält. Könnte das auch an return START_STICKY liegen?

— geändert am 27.12.2014, 17:54:02

Antworten
fileerror
  • Forum-Beiträge: 116

27.12.2014, 17:58:59 via App

verstehe ich das richtig?

if (shredPrefs.getBoolean("deinKey",false)){ //<-- nun ist der Standart Wert false.

wenn "deinKey" mit true gespeichert ist wird true zurück gegeben, wenn er false ist false, und wenn er gar nicht existiert false?

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

27.12.2014, 18:00:28 via Website

Genau so ist es :)

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
fileerror
  • Forum-Beiträge: 116

27.12.2014, 18:06:38 via Website

Ah wieder was wichtiges gelernt! Danke dir!
Bei mir steht da tatsächlich (von derArt) :
if (shredPrefs.getBoolean("deinKey", deinKey)) :D

Was passiert da?

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

27.12.2014, 18:21:27 via Website

Da dürfte garnichts passieren, weil ein Error kommt.
Aber nur wenn
1. die Variable deinKey nicht existiert
2. Die variable deinKey keine boolean ist

Und sonst macht es keinen sinn das so zu schreiben, ich würde entweder als Standartwert false hinschreiben oder prüfen ob dein Key existiert und wenn nein das entsprechend behandeln.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten