共享首选项空指针异常

Ash*_*ado 0 android sharedpreferences android-fragments android-activity

我现在已经有这个问题了一段时间,每当我试图解决它时,我已经放弃了几个小时.

这是我用来与共享首选项进行交互的类.

public class AppStatus {

    final static String TAG = "AppStatus";
    private static AppStatus instance = new AppStatus();
    static Context context;
    boolean connected = false;
    public  boolean IF_PAST = false;
    ConnectivityManager connectivityManager;

    public static final String FILE_NAME = "appdata";
    public final String AUTH_KEY = "auth_key";
    public final String TEAM_NAME = "team_name";
    public final String TEAM_LOGO = "team_logo";
    public final String LOGIN_STATUS = "login_status";
    public final String CURRENT_TEAM = "current_team";
    public final String TOTAL_TEAMS = "total_teams";
    public final String USER_NAME = "user_name";
    public final String PASSWORD = "password";
    public final String USERID = "user_id";
    public final String GCM_KEY = "gcm_key";
    public final String NOTIFIER_TEAM_ID = "id";
    public final String NOTIFIER_SCHEDULE_ID = "schedule_id";
    public final boolean IS_FROM_PUSH_NOTIFICATION = false;
    public final String FAMILY_MEMBERS_ID = "family_memebers_id";
    public final String IS_PARENT = "is_parent";
    public final String IS_PUSH_NOTIFICATION_ENABLED = "is_notification_enabled";
    public final String BASE_URL = "https://www.fasfasdf.com";
    public final String IS_USER_API_CALLED = "is_user_api_called";

    public static AppStatus getInstance(Context ctx) {
        context = ctx;
        return instance;
    }

    public Boolean isOnline() {

        try {
            connectivityManager = (ConnectivityManager) context
                    .getSystemService(Context.CONNECTIVITY_SERVICE);

            NetworkInfo networkInfo = connectivityManager
                    .getActiveNetworkInfo();
            connected = networkInfo != null && networkInfo.isAvailable()
                    && networkInfo.isConnected();
            return connected;

        } catch (Exception e) {
            LogUtils.LOGE(TAG, e.toString());
        }
        return connected;
    }

    public Boolean isRegistered() {
        try {
            if (!getSharedBoolValue(LOGIN_STATUS))
                return false;
            else
                return true;
        } catch (Exception e) {
            LogUtils.LOGE(TAG, e.toString());
        }

        return false;
    }

    public Boolean validateEditText(EditText field) {
        String strField = field.getText().toString();
        if (strField.trim().equals("")) {
            return false;
        }
        return true;
    }

    public String getSharedStringValue(String key) {
        SharedPreferences sp = context.getSharedPreferences("FILE_NAME", 0);
        String value = sp.getString(key, null);
        return value;
    }

    public boolean saveSharedStringValue(String key, String value) {
        SharedPreferences sp = context.getSharedPreferences("FILE_NAME", 0);
        Editor edit = sp.edit();
        edit.putString(key, value);
        return edit.commit();
    }

    public boolean clearSharedData() {
        SharedPreferences sp = context.getSharedPreferences("FILE_NAME", 0);
        Editor edit = sp.edit();
        edit.clear();
        return edit.commit();
    }

    public boolean clearSharedDataWithKey(String key) {
        SharedPreferences sp = context.getSharedPreferences("FILE_NAME", 0);
        Editor edit = sp.edit();
        edit.remove(key);
        return edit.commit();
    }

    public Boolean getSharedBoolValue(String key) {
        SharedPreferences sp = context.getSharedPreferences("FILE_NAME", 0);
        Boolean value = sp.getBoolean(key, false);
        return value;
    }

    public boolean saveSharedBoolValue(String key, Boolean value) {
        SharedPreferences sp = context.getSharedPreferences("FILE_NAME", 0);
        Editor edit = sp.edit();
        edit.putBoolean(key, value);
        return edit.commit();
    }

    public int getSharedIntValue(String key) {
        SharedPreferences sp = context.getSharedPreferences("FILE_NAME", 0);
        int value = sp.getInt(key, 0);
        return value;
    }

    public boolean saveSharedIntValue(String key, int value) {
        SharedPreferences sp = context.getSharedPreferences("FILE_NAME", 0);
        Editor edit = sp.edit();
        edit.putInt(key, value);
        return edit.commit();
    }
}
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,看似随机共享的首选项会获得零点异常.

我像这样实例化appStatus = AppStatus.getInstance(context);.并以这种方式使用appStatus.getSharedStringValue(appStatus.CURRENT_TEAM);

我可以在不同的片段/活动之间切换几次没有问题然后无处不在我收到我的错误.

  --------- beginning of crash
08-10 10:28:42.761  25908-25908/com.bonziteamandroid E/AndroidRuntime? FATAL EXCEPTION: main
    Process: com.bonziteamandroid, PID: 25908
    java.lang.IllegalStateException: Could not execute method of the activity
            at android.view.View$1.onClick(View.java:4007)
            at android.view.View.performClick(View.java:4756)
            at android.view.View$PerformClick.run(View.java:19749)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
     Caused by: java.lang.reflect.InvocationTargetException
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at android.view.View$1.onClick(View.java:4002)
            at android.view.View.performClick(View.java:4756)
            at android.view.View$PerformClick.run(View.java:19749)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.SharedPreferences android.content.Context.getSharedPreferences(java.lang.String, int)' on a null object reference
            at com.bonziteamandroid.helpers.AppStatus.getSharedStringValue(AppStatus.java:94)
            at com.bonziteamandroid.annoucement.AnnouncementsFragment.getAnnouncments(AnnouncementsFragment.java:121)
            at com.bonziteamandroid.annoucement.AnnouncementsFragment.onCreateView(AnnouncementsFragment.java:50)
            at android.support.v4.app.Fragment.performCreateView(Fragment.java:1786)
            at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:953)
            at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1136)
            at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:739)
            at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1499)
            at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:488)
            at com.bonziteamandroid.BonziNativeActivity$ActionManager.setActionOnChange(BonziNativeActivity.java:1352)
            at com.bonziteamandroid.BonziNativeActivity.onAnnouncementsItemClick(BonziNativeActivity.java:337)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at android.view.View$1.onClick(View.java:4002)
            at android.view.View.performClick(View.java:4756)
            at android.view.View$PerformClick.run(View.java:19749)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
Run Code Online (Sandbox Code Playgroud)

我想知道是否有人有类似的问题?或者或许有一个比这更有建议的方法,我已经google了,以前的答案似乎并不适用.此外,一旦我第一次设置共享首选项,我不会在大多数视图之间清除/擦除它们仍然偶尔会得到空指针异常.

and*_*lic 5

在某些情况下,您的上下文似乎为空.更简洁的方法是声明一个具有静态方法的类来更新和检索您的SharedPreferences.这些静态方法中的每一个都将采用上下文参数和要更新的值.像这样的东西:

public class PreferenceUtil {

    public static void setEnabled(final Context context, final boolean enabled) {
        SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(context);
        sharedPref.edit().putBoolean("your_key", enabled).commit();
    }

    public static boolean isEnabled(final Context context) {
        SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(context);
        return sharedPref.getBoolean("your_key", true);
    }

}
Run Code Online (Sandbox Code Playgroud)