0

SessionManager.javaFehler eine Aktivität über Absicht in Start

package com.example.healthtracker; 
import android.content.Context; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.content.SharedPreferences.Editor; 

public class SessionManager { 

    private Context c; 
    private SharedPreferences session; 
    private String uname="username"; 
    private String uid="userID"; 
    private String status="IsLoggedIn"; 
    int PRIVATE_MODE = 0; 
    ////////////////////methods/////////////////////////////////////// 
    public SessionManager(Context c) { 
     session= c.getSharedPreferences("Session", PRIVATE_MODE); 
    } 

    public void createLoginSession(String name,int id){ 
     Editor e=session.edit(); 
     e.putString(uname, name); 
     e.putInt(uid, id); 
     e.putBoolean(status, true); 
     e.commit(); 
    } 

    public String[] getUserDetails(){ 
     String[] a= new String[2]; 
     Integer id=session.getInt(uid,-1); 
     a[0]=(String) session.getString(uname, null); 
     a[1]=id.toString(); 
     return a;// string array containing userId and user name 
    } 

    /** 
    * Check login method will check user login status 
    * If false it will redirect user to login page 
    * Else won't do anything 
    * */ 
    public void checkLogin(){ 
     // Check login status 
     if(!this.isLoggedIn()){ 
      // user is not logged in redirect him to Login Activity 
      Intent i = new Intent(c, Login.class); 
      // Closing all the Activities 
      i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
      // Add new Flag to start new Activity 
      i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      // Staring Login Activity 
      c.startActivity(i); 
     } 

    } 

    // return status 
    public boolean isLoggedIn(){ 
     return session.getBoolean(status, false); 
    } 

    // clear logged user data 
    public void logout(){ 
     Editor e = session.edit(); 
     e.clear(); 
     e.commit(); 


     //redirecting to login page 
     Intent i = new Intent(c,Login.class); 
     // Closing all the Activities 
     i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     // Add new Flag to start new Activity 
     i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     // Staring Login Activity 
     c.startActivity(i); 
    } 


} 

Profile.java

package com.example.healthtracker; 
import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Toast; 

public class Profile extends Activity { 

    SessionManager session; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main_profile); 


    /////////////////////////done setup/////////////////////////////////////////////////////////////////////// 
     /** 
     * Call this function whenever you want to check user login 
     * This will redirect user to LoginActivity is he is not 
     * logged in 
     * */ 
     final EditText e1= (EditText) findViewById(R.id.sData1); 
     final EditText e2= (EditText) findViewById(R.id.sData2); 
     Button b1= (Button) findViewById(R.id.LogoutSession); 
     session = new SessionManager(getApplicationContext()); 
     b1.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 
       if(session.isLoggedIn()) 
       { 
        String[] details= session.getUserDetails(); 
        e1.setText(details[0]);// not working 
        e2.setText(details[1]);// not working 
        session.logout();// error 
       } 
       else 
        Toast.makeText(getApplicationContext(), "not logged",Toast.LENGTH_SHORT).show(); 
      } 
     }); 
     //session.checkLogin(); 
    } 



} 

In Profil Aktivität möchte ich ein Logout-Button haben, die, wenn sie mit klaren geklickt der Benutzerdaten (Benutzername, Benutzer-ID, Status) werden in sharedPreferences gespeichert. Auch nach dem Klicken sollte der Benutzer auf die Anmeldeseite umgeleitet werden. Aber meine App stürzt ab, wenn ich auf den Logout-Button klicke. Unten sind die Protokolle von Logcat

06-10 04:54:14.664: W/dalvikvm(2761): threadid=1: thread exiting with uncaught exception (group=0x40a71930) 
06-10 04:54:14.764: E/AndroidRuntime(2761): FATAL EXCEPTION: main 
06-10 04:54:14.764: E/AndroidRuntime(2761): java.lang.NullPointerException 
06-10 04:54:14.764: E/AndroidRuntime(2761):  at android.content.ComponentName.<init>(ComponentName.java:75) 
06-10 04:54:14.764: E/AndroidRuntime(2761):  at android.content.Intent.<init>(Intent.java:3491) 
06-10 04:54:14.764: E/AndroidRuntime(2761):  at com.example.healthtracker.SessionManager.logout(SessionManager.java:71) 
06-10 04:54:14.764: E/AndroidRuntime(2761):  at com.example.healthtracker.Profile$1.onClick(Profile.java:40) 
06-10 04:54:14.764: E/AndroidRuntime(2761):  at android.view.View.performClick(View.java:4204) 
06-10 04:54:14.764: E/AndroidRuntime(2761):  at android.view.View$PerformClick.run(View.java:17355) 
06-10 04:54:14.764: E/AndroidRuntime(2761):  at android.os.Handler.handleCallback(Handler.java:725) 
06-10 04:54:14.764: E/AndroidRuntime(2761):  at android.os.Handler.dispatchMessage(Handler.java:92) 
06-10 04:54:14.764: E/AndroidRuntime(2761):  at android.os.Looper.loop(Looper.java:137) 
06-10 04:54:14.764: E/AndroidRuntime(2761):  at android.app.ActivityThread.main(ActivityThread.java:5041) 
06-10 04:54:14.764: E/AndroidRuntime(2761):  at java.lang.reflect.Method.invokeNative(Native Method) 
06-10 04:54:14.764: E/AndroidRuntime(2761):  at java.lang.reflect.Method.invoke(Method.java:511) 
06-10 04:54:14.764: E/AndroidRuntime(2761):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
06-10 04:54:14.764: E/AndroidRuntime(2761):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
06-10 04:54:14.764: E/AndroidRuntime(2761):  at dalvik.system.NativeStart.main(Native Method) 

Ich bin neu in Android. Kann mir jemand helfen, herauszufinden, was ich hier falsch mache?

+6

Mögliche Duplikate von [Was ist eine NullPointerException, und wie behebe ich es?] (Http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix -it) –

+0

sehe meine Antwort unter –

Antwort

2

Der Kontext c, die Sie verwenden, ist null.To dieser Konstruktor in Ihrem Sessionmanager zu lösen zuweisen den Kontext Sie als c auf den Kontext erklärt werden, haben Sie

public SessionManager(Context c) { 
    this.c=c; 
} 
+0

Ja, Sie haben Recht .. – smasher

0

Ersetzen Sie diese Methode im Konstruktor immer

public SessionManager(Context c) { 
     session= c.getSharedPreferences("Session", PRIVATE_MODE); 
    } 

mit

public SessionManager(Context c) { 
     this.c =c; 
     session= c.getSharedPreferences("Session", PRIVATE_MODE); 
    } 

Ihr Kontext c ist null die wird nie zugewiesen, weshalb Sie einen Fehler sehen.