这个问题在这里已有答案:
我在下面的代码中使用共享首选项。
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)
我如何在这里定义上下文?
你的堆栈跟踪:
方法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");
}
}