0

SessionManager.java

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 profile activity I want to have a logout button which when clicked with clear the user data (username , user_id, status) saved in sharedPreferences. Also after clicking it should be redirecting the user to the login page. But my app crashes whenever I click the logout button. Below is the logs from 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)

I am new to Android . Can anyone help me out in finding out what I'm doing wrong here?

dlemstra
  • 7,813
  • 2
  • 27
  • 43
smasher
  • 294
  • 2
  • 17

2 Answers2

2

The Context c which you are using is null.To resolve this in your SessionManager constructor assign the context you are have declared as c to the context you are getting in the constructor

public SessionManager(Context c) {
    this.c=c;
}
Pramod Yadav
  • 2,316
  • 2
  • 23
  • 36
0

Replace this method

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

with

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

Your context c is null which is never assigned thats why you facing error.

Suhas Bachewar
  • 1,230
  • 7
  • 21