通过意图启动活动时出错

时间:2016-06-10 05:17:49

标签: android android-intent nullpointerexception android-sharedpreferences

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();
    }



}

在配置文件活动中,我希望有一个注销按钮,单击此按钮可清除保存在sharedPreferences中的用户数据(用户名,user_id,状态)。点击后也应该将用户重定向到登录页面。 但是,只要我点击退出按钮,我的应用就会崩溃。以下是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)

我是Android新手。谁能帮助我找出我在这里做错了什么?

2 个答案:

答案 0 :(得分:2)

您正在使用的Context c为null。要在SessionManager构造函数中解析此问题,请将已声明为c的上下文分配给您在构造函数中获取的上下文

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

答案 1 :(得分:0)

替换此方法

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

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

您的上下文c为null,永远不会分配,这就是您面临错误的原因。