Ошибка при запуске действия через намерение
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. Также после нажатия на него следует перенаправить пользователя на страницу входа. Но мое приложение вылетает всякий раз, когда я нажимаю кнопку выхода из системы. Ниже логи от 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 ответа
Контекст c, который вы используете, имеет значение null. Чтобы разрешить это в конструкторе SessionManager, присвойте контекст, который вы объявили как c, контексту, который вы получаете в конструкторе.
public SessionManager(Context c) {
this.c=c;
}
Заменить этот метод
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, которое никогда не назначается, поэтому вы сталкиваетесь с ошибкой.