共享首选项为空,是否因为上下文? [重复]

问题描述 投票:-4回答:1

这个问题在这里已有答案:

我在下面的代码中使用共享首选项。

    private Context mCtx;   
private static SharedPrefManager mInstance;
    public SharedPrefManager(Context context) {
            mCtx = context;
        }    
public static synchronized SharedPrefManager getInstance(Context context) {
        if (mInstance == null)
            mInstance = new SharedPrefManager(context);
        return mInstance;
    }
    void SaveNotificationType(String strNotificationType) {
            SharedPreferences sharedPreferences = mCtx.getSharedPreferences(Shared_Pref_Name, Context.MODE_PRIVATE);
            Log.d(TAG, "SaveNotificationType: shared preferences is" + sharedPreferences);
            try {
                if(sharedPreferences != null) {
                    SharedPreferences.Editor editor = sharedPreferences.edit();
                    editor.putString(notificationType, strNotificationType);
                    editor.apply();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            //editor.commit();
        }  

当我运行上面的代码时,我得到一个错误,如下所示:

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.example.durga_bikkina.storageunitburnstatus.SharedPrefManager.SaveNotificationType(SharedPrefManager.java:41)
        at com.example.durga_bikkina.storageunitburnstatus.MyFirebaseMessagingService.storeReceivedMessage(MyFirebaseMessagingService.java:125)
        at com.example.durga_bikkina.storageunitburnstatus.MyFirebaseMessagingService.onMessageReceived(MyFirebaseMessagingService.java:36)
        at com.google.firebase.messaging.FirebaseMessagingService.handleIntent(Unknown Source:340)
        at com.google.firebase.iid.zzg.run(Unknown Source:29)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
        at java.lang.Thread.run(Thread.java:764)  

我如何在这里定义上下文?

android sharedpreferences
1个回答
1
投票

你的堆栈跟踪:

方法Context.getSharedPreferences对空对象引用

所以你的mCtx是空的。您需要提供非null的Context,应用程序上下文也适合。

例如。你可以提供它作为参数,也许来自你的Activity

class MyActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // other actions like setContentView
        new SharedPrefManager(this).SaveNotificationType("Some text");

        // or you can also use applicationContext
        new SharedPrefManager(getApplicationContext()).SaveNotificationType("Some text");

        // or use singleton instance if you want
        SharedPrefManager.getInstance(this).SaveNotificationType("Some text");
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.