2016-11-30 3 views
0

Ich habe eine App mit einem Login-Prozess, jedes Mal der Benutzer anmeldet ich die Informationen in einer LoginHolder Klasse speichern wie folgt aus:Keeping Benutzerstatus im Speicher

private static final java.lang.String TAG = tag(LoginHolder.class); 
private static LoginHolder INSTANCE; 
private SharedPreferences mSharedPreferences; 


private LoginDetails mLoginDetails; 
private UserInfo mUserInfo; 

private LoginHolder(SharedPreferences sharedPreferences) { 
    mSharedPreferences = sharedPreferences; 
} 

public synchronized static LoginHolder instance(SharedPreferences prefs) { 
    if (INSTANCE == null) { 
     INSTANCE = new LoginHolder(prefs); 
    } 
    return INSTANCE; 
} 

public LoginDetails getLoggedUser() { 
    return mLoginDetails; 
} 

@DebugLog 
public void setLoggedUser(@NonNull LoginDetails loginDetails) { 
    this.mLoginDetails = loginDetails; 
} 



@DebugLog 
void setUserInfo(@NonNull UserInfo userInfo) { 
    mUserInfo = userInfo; 
} 

public UserInfo getUserInfo() { 
    return mUserInfo; 
} 

}

Wie Sie sehen können Dies ist eine Singleton-Klasse, die ich mit Dolch injiziere.

Jetzt habe ich zwei Aktivitäten, eine ist Aktivität A und zweite ist Aktivität B. A startet Aktivität B (und konzeptionell ist seine Eltern, eine Art Master-Detail-Beziehung). Wenn nun bei B ein Absturz auftritt, wird die A-Aktivität neu erstellt. Ich habe das mit Logging überprüft und tatsächlich wurde die ganze App neu erstellt (bis auf das Application-Objekt). Dies bewirkt, dass der Singleton weggeht und somit auch die Benutzerinformation.

Bisher habe ich es nur in diesem Fall reproduzieren könnte, aber ich fürchte, das auch unerwartet in anderen Fällen geschehen könnte (irgendwelche Ideen?)

Wie kann ich jederzeit mit diesen Daten im Speicher erhalten (bis dem Benutzer loggt sich natürlich aus)?

+0

Gebrauch einfach SHaredPreference. –

+1

"Wie ist das möglich?" - Da "mUserInfo" niemals einen Wert zugewiesen bekommt, ist es immer "null". Es sei denn natürlich, Sie zeigen hier nicht Ihren 'LoginHelper' Code. In diesem Fall können wir Sie nicht wirklich beraten, da wir keine Ahnung haben, was Ihr Code ist, der mUserInfo referenziert und manipuliert. – CommonsWare

+0

@CommonsWare das ist richtig, ich habe nicht den ganzen Code, ich habe es nur die Getter und Setter – MichelReap

Antwort

0

Wie kann ich diese Informationen jederzeit im Speicher behalten?

Erstellen Sie eine Anwendungsklasse, die erweitert android.app.Application und definieren Sie LoginDetails innerhalb dieser Klasse.

In diesem Fall bleibt dieser Wert für den gesamten App-Lebenszyklus im Speicher erhalten.

Beispiel:

public class MyApplication extends Application { 

    private static MyApplication instance; 
    private LoginDetails loginDetails; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     instance = this; 
    } 

    public static LoginDetails getLoginDetails() { 
     return instance.loginDetails; 
    } 
    public static void setLoginDetails(LoginDetails loginDetails) { 
     instance.loginDetails = loginDetails; 
    } 
} 

Und in Ihrem Manifest

<application 
    android:name=".MyApplication" 
    ..... 
</application> 
+0

Dies ist, was ich tue, aber Application Objekt wird auch neu erstellt. Überprüfen Sie meine aktualisierte Frage. – MichelReap

+0

Sie müssen diese Daten dann beibehalten. Die Verwendung von SharedPreferences ist eine Option. – Manza