Wie verhindere ich die mehrfach Initialisierung von onCreate ?

  • 59 Antworten
  • Neuester Beitrag
Diskutiere Wie verhindere ich die mehrfach Initialisierung von onCreate ? im Android App Entwicklung im Bereich Betriebssysteme & Apps.
znieh99

znieh99

Fortgeschrittenes Mitglied
Hallo Forum,
ich habe ein paar Werte die ich in onCreate initialisiere. Bei einen weiteren Durchlauf von onCreate sollen aber die nun geänderten Werte benutzt werden. Ich habe da schon mal kurz was gelesen (speichern und auslesen), finde es aber nicht mehr. Kann mir dabei wer helfen?
lg heinz
 
swa00

swa00

Moderator
Teammitglied
Hallo Heinz,

du kannst Settings | Android Developers verwenden.

Alternativ dazu ggf. SQlite, welches ich in der Hauptsache für die Settings verwende,
Bei kleinen Sachen lohnt sich das allerdings nicht.

Auch solltest du dir OnResume/OnPause anschauen
 
Zuletzt bearbeitet:
znieh99

znieh99

Fortgeschrittenes Mitglied
swa00

swa00

Moderator
Teammitglied
Hallo Heinz

ich arbeite NICHT mit OnSaveInstance, da es eher eine unsichere Technik darstellt.

Deshalb kann ich Dir in dem Falle nicht weiterhelfen

Viel Erfolg
 
Zuletzt bearbeitet:
Vacutainer

Vacutainer

Erfahrenes Mitglied
znieh99 schrieb:
Vacutainer schrieb:
Hallo Vacutainer,
ja danke, das meine ich. Aber was ich nicht verstehe ist: "Your app should implement the onSaveInstanceState() callback after the onPause() method, and before onStop(). Do not implement this callback in onPause()."

Ich habe nichts zwischen den beiden Methoden? Ich würde das am liebsten in onDestroy unterbringen?
lg heinz
onSaveInstanceState wird im ActivityLifecycle automatisch vom System aufgerufen. Du musst nur die Methode überschreiben, wie in dem Guide beschrieben.

@swa000 Warum ist onSaveInstanceState unsicher?
 
swa00

swa00

Moderator
Teammitglied
Weil du dem System überlässt, was es machen soll.

Eine vom Entwickler eindeutiges zugewiesenes Flag-Handling ist damit besser ..
 
znieh99

znieh99

Fortgeschrittenes Mitglied
swa00

swa00

Moderator
Teammitglied
Hallo Heinz,

da muss dir Vacutaimer behilflich sein , ich müsste mich genau so erst mal wieder
schlau machen , da ich es lange nicht mehr benutzt habe ..

Aber ich sehe , er ist online :)
 
Vacutainer

Vacutainer

Erfahrenes Mitglied
znieh99 schrieb:
Vacutainer schrieb:
Du musst nur die Methode überschreiben, wie in dem Guide beschrieben.
Ja und dort steht die Methode onSaveInstanceState() ist zwischen onPause() und onStop() zu plazieren? Wo bitte ist das?
Das ist nicht wörtlich gemeint. Die genau Position in der Datei spielt keine Rolle. Füg die Methode so ein, dass sie nach onCreate folgt.
Wenn du onPause und onStop nicht selbst überschreibst, sind die nicht in der Datei vorhanden.
Trotzdem ruft Android onSaveInstanceState nach onPause und vor onStop auf. Das ist mit "zwischen" gemeint.
 
znieh99

znieh99

Fortgeschrittenes Mitglied
Ok, ich verstehe, danke dir,
lg heinz
-- Dieser Beitrag wurde automatisch mit dem folgenden Beitrag zusammengeführt --
Da onPause() auch ein onCreate() auslösen kann, nutzt mir ein onSaveInstanceState() nach onPause() nichts. Daher werde ich mir mal den Vorschlag von @swa00 ansehen,
lg heinz
 
Vacutainer

Vacutainer

Erfahrenes Mitglied
Es ist doch völlig richtig, dass onCreate aufgerufen wird. Du musst in onCreate nur überprüfen, ob es einen gespeicherten Stand gibt. Siehe:
Code:
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); // Always call the superclass first


    // Check whether we're recreating a previously destroyed instance
    if (savedInstanceState != null) {
        // Restore value of members from saved state
        mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
        mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
    } else {
        // Probably initialize members with default values for a new instance
    }
    // Hier den Rest von onCreate. Aufpassen, dass du den wiederhergestellten Status nicht direkt wieder überschreibst.
}
swa00 schrieb:
Weil du dem System überlässt, was es machen soll.

Eine vom Entwickler eindeutiges zugewiesenes Flag-Handling ist damit besser ..
Aber nur für das wiederherstellten des ViewStates und der aktuellen Variablen sind Settings und ne Datenbank schon ein wenig Overkill.
Hattest du mal Probleme mit onSaveInstanceState?
 
znieh99

znieh99

Fortgeschrittenes Mitglied
Vacutainer schrieb:
Es ist doch völlig richtig, dass onCreate aufgerufen wird. Du musst in onCreate nur überprüfen, ob es einen gespeicherten Stand gibt. Siehe:
Ich weiß nicht ob ich richtig liege, aber ich sehe das so:
In onCreate() werden erstmalig die Werte initialisiert. Die App arbeitet die Werte werden verändert. Nun tritt onPause() ein und ruft wieder onCreate() auf. In onCreate() wird nun - da ein onSaveInstanceState() ja erst nach onPause erstellt wird - noch einmal initialisiert, was falsch wäre.
 
markus.tullius

markus.tullius

Dauergast
onRestoreInstanceState() und onSaveInstanceState() finde ich extrem umständlich. Ich benutze dann lieber schon mal protected void onNewIntent(Intent intent).

Am liebsten mache ich es aber wie @swa00, insbesondere wenn im Hintergrund ein Service läuft, der den Content updatet.

Und wenn ich Fragmente benutze, brauche ich es auch nicht, weil ich dann nur eine Activity benutze. Und bei Wechseln zwischen zwei Activity benutze ich häufiger kein finish(), weshalb onCreate() dann nicht nicht aufgerufen wird.
 
Vacutainer

Vacutainer

Erfahrenes Mitglied
znieh99 schrieb:
Vacutainer schrieb:
Es ist doch völlig richtig, dass onCreate aufgerufen wird. Du musst in onCreate nur überprüfen, ob es einen gespeicherten Stand gibt. Siehe:
Ich weiß nicht ob ich richtig liege, aber ich sehe das so:
In onCreate() werden erstmalig die Werte initialisiert. Die App arbeitet die Werte werden verändert. Nun tritt onPause() ein und ruft wieder onCreate() auf. In onCreate() wird nun - da ein onSaveInstanceState() ja erst nach onPause erstellt wird - noch einmal initialisiert, was falsch wäre.
onPause() ruft nicht onCreate() auf. Das wäre ja auch völlig sinnlos, da die Activity beim Aufruf von onPause() eben pausiert wird. Warum sollte sie dann neu initialisiert werden?
Was genau versuchst du eigentlich zu speichern? Vielleicht ist onSaveInstanceState() der falsche Weg.


markus.tullius schrieb:
onRestoreInstanceState() und onSaveInstanceState() finde ich extrem umständlich. Ich benutze dann lieber schon mal protected void onNewIntent(Intent intent).

Am liebsten mache ich es aber wie @swa00, insbesondere wenn im Hintergrund ein Service läuft, der den Content updatet.

Und wenn ich Fragmente benutze, brauche ich es auch nicht, weil ich dann nur eine Activity benutze. Und bei Wechseln zwischen zwei Activity benutze ich häufiger kein finish(), weshalb onCreate() dann nicht nicht aufgerufen wird.
Aber onNewIntent() ist im vorliegenden Fall meiner Meinung nach noch deutlich umständlicher. Dann gibst du ja beim Beenden der Activity die aktuellen Werte weiter, um sie dann beim Aufrufen wieder weiterzugeben. Oder wie meinst du das?

Meiner Meinung nach sind Settings, also SharedPreferences und eine Datenbank nur sinnvoll, wenn es sich um dauerhaft zu speichernde Daten handelt. Wenn ich nur mal eben die aktuellen Werte speichern will, bspw wenn die Activity nach einem orientationChange neu initialisiert wird ist onSaveInstanceState() der richtige Weg. So ist es von Google ja auch vorgesehen.
 
znieh99

znieh99

Fortgeschrittenes Mitglied
Vacutainer schrieb:
onPause() ruft nicht onCreate() auf. Das wäre ja auch völlig sinnlos
Das Activity-lifecycle concepts sieht dies aber sehr wohl vor?

Eigentlich will ich nichts anderes als beim Abarbeiten von onCreate() zu wissen ob es der erste Aufruf oder ein wiederholter Aufruf aus was immer für welche Gründe ist.
lg heinz
 
swa00

swa00

Moderator
Teammitglied
Und dazu schreibst du dir einen wert in deine Preferences und juut iss

Zwei Zeilen Arbeit, das wars


Beispiel :

Init :
SharedPreferences sharedpreferences = getSharedPreferences("MEINAPPNAME" Context.MODE_PRIVATE);
Editor editor = sharedpreferences.edit();
Lesen :
int AllesSchonGemacht = sharedpreferences.getInt("key",0);
Schreiben :
editor.putInt("key", valueAlsInteger); editor.commit();
 
Zuletzt bearbeitet:
znieh99

znieh99

Fortgeschrittenes Mitglied
swa00 schrieb:
Und dazu schreibst du dir einen wert in deine Preferences und jutt iss
Zwei Zeilen arbeit, das wars
Ja, das habe ich gemacht. Und dabei die zweite Zeile (die das Setzen in onCreate() wieder aufhebt) in onDestroy() geschrieben. Funktioniert leider nicht, da auch der Wechsel von Portray zu Landscape onDestroy() aufruft. Aber das habe ich mit einem anderen Flag abgefangen.

Aber vom Prinzip her würde ich gerne wissen ob meine Aussage bzgl. onPause() und onCreate() stimmt.
lg heinz
 
Vacutainer

Vacutainer

Erfahrenes Mitglied
znieh99 schrieb:
Das Activity-lifecycle concepts sieht dies aber sehr wohl vor?

Eigentlich will ich nichts anderes als beim Abarbeiten von onCreate() zu wissen ob es der erste Aufruf oder ein wiederholter Aufruf aus was immer für welche Gründe ist.
lg heinz


Der Lifecycle sieht das eben nicht vor. Wie kommst du darauf, dass es so ist?

Meinst du erster Aufruf in der aktuellen Session, oder allererster nach Installation der App? Bei ersterem reicht onSaveInstanceState(). Bei letzterem sind SharedPreferences sinnvoll.

swa00 schrieb:
Und dazu schreibst du dir einen wert in deine Preferences und jutt iss

Zwei Zeilen arbeit, das wars
Funktioniert ohne Zweifel so, ich halte aber iA onSaveInstanceState() für sinnvoller. Sonst müllst du dir bei temporären Aktionen die Prefs voll. Macht zwar auch nichts, scheint mir aber unsauber.
Zudem ist onSaveInstanceState von Google explizit dafür vorgesehen. Die werden sich schon was dabei gedacht haben :p
 
Zuletzt bearbeitet:
swa00

swa00

Moderator
Teammitglied
@Vacutainer

OT : Tue mir bitte einen Gefallen und mache bitte nicht "Vollzitate" - wird dann schnell unübersichtilch ...
Kannste deine Post biitte ein wenig abspecken ? - Danke :)