Java 使用PreferenceFragment时从截击中获取空指针错误

Java 使用PreferenceFragment时从截击中获取空指针错误,java,android,mysql,android-volley,preferencefragment,Java,Android,Mysql,Android Volley,Preferencefragment,我正在尝试制作一个应用程序,用户可以登录并将其用户数据保存到mysql数据库中。 我使用PreferenceActivity和PreferenceFragment来处理这个问题。通常,在我更改用户之前,这一切都很正常 所以“用户A”更改PreferenceFragment中的一个值。比如他的城市。(即“主干道1”) 数据存储在SharedPrefs中并发送到Web。 -首选项屏幕将使用新数据进行更新。 -一切都很好 UserA更改下一个值,即他的电子邮件(userA@user.com) 现在

我正在尝试制作一个应用程序,用户可以登录并将其用户数据保存到mysql数据库中。 我使用PreferenceActivity和PreferenceFragment来处理这个问题。通常,在我更改用户之前,这一切都很正常

  • 所以“用户A”更改PreferenceFragment中的一个值。比如他的城市。(即“主干道1”)
  • 数据存储在SharedPrefs中并发送到Web。 -首选项屏幕将使用新数据进行更新。 -一切都很好
  • UserA更改下一个值,即他的电子邮件(userA@user.com)
现在,当用户A注销而用户B登录时会发生错误。(在注销时,使用clear()和commit()清除共享的pref…)

  • 用户B从Web获取自己的数据
  • 数据正确显示在首选项屏幕中
  • 用户B也想更改他的电子邮件地址
  • 现在,来自UserA的旧EditTextPreference值(userA@user.com)单击EditTextPreference项时可见(不知道这是否已导致错误)
  • UserB删除它并在他的新电子邮件中键入(userB@user.com)
应用程序停止与

java.lang.NullPointerException:尝试调用虚拟方法“java.io.File android.content.Context.getCacheDir()”
关于空对象引用
位于com.android.volley.toolbox.volley.newRequestQueue(volley.java:43)
位于com.android.volley.toolbox.volley.newRequestQueue(volley.java:78)
在com.jamp.jamp.UserProfileSettingsFragment.onSharedPreferenceChanged上(UserProfileSettingsFragment.java:171)
在android.app.SharedReferencesImpl$EditorImpl.notifyListeners上(SharedReferencesImpl.java:479)
在android.app.SharedReferencesImpl$EditorImpl.apply上(SharedReferencesImpl.java:387)
位于android.preference.preference.tryCommit(preference.java:1415)
位于android.preference.preference.persistString(preference.java:1448)
在android.preference.EditTextPreference.setText(EditTextPreference.java:94)中
在android.preference.EditTextPreference.onDialogClosed(EditTextPreference.java:148)中
在android.preference.DialogPreference.onDismiss(DialogPreference.java:395)
在android.app.Dialog$ListenersHandler.handleMessage(Dialog.java:1337)
位于android.os.Handler.dispatchMessage(Handler.java:102)
位于android.os.Looper.loop(Looper.java:154)
位于android.app.ActivityThread.main(ActivityThread.java:6077)
位于java.lang.reflect.Method.invoke(本机方法)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run上(ZygoteInit.java:866)

在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
好的,我知道了。发现其他一些具有类似问题的线程

我的
Context mContext=getActivity().getApplicationContext()。但这似乎还早,因为片段中的onCreate方法还没有被调用,而且上下文中没有应该指向的活动,所以返回null。我将mContext变量移动到onCreate方法,将其从onPreferenceChange中删除(还做了一些其他调整…),现在onPreferenceChange似乎在等待onCreate方法,它工作得很好

package com.jamp.jamp;
导入android.content.Context;
导入android.content.SharedReferences;
导入android.os.Bundle;
导入android.preference.preference;
导入android.preference.PreferenceFragment;
导入android.preference.PreferenceManager;
导入android.support.v7.app.AlertDialog;
导入android.widget.Toast;
导入com.android.volley.RequestQueue;
导入com.android.volley.Response;
导入com.android.volley.toolbox.volley;
导入org.json.JSONException;
导入org.json.JSONObject;
导入java.io.IOException;
导入java.util.HashMap;
/**
*由Erikken于2017年9月5日创建。
*/
公共类UserProfileSettingsFragment扩展首选项Fragment实现SharedReferences.OnSharedPreferenceChangeListener
{
会话管理器会话;
语境;
字符串prefs_realname;
字符串prefs_电子邮件;
字符串prefs_streetname;
字符串prefs_邮政编码;
字符串优先于S_市;
字符串预处理状态;
@凌驾
创建时的公共void(最终捆绑包savedInstanceState)
{
final SharedReferences prefs=PreferenceManager.GetDefaultSharedReferences(getActivity().getApplicationContext());
final SharedPreferences.Editor=prefs.edit();
prefs.RegisterOnSharedReferenceChangeListener(此);
mContext=getActivity().getApplicationContext();
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.usersettings);
会话=新会话管理器(getActivity().getApplicationContext());
session.CheckLogin();
HashMap user=session.getUserDetails();
最后一个字符串sessionUsername=user.get(SessionManager.KEY\u用户名);
最后一个字符串sessionPassword=user.get(SessionManager.KEY\u密码);
//响应者请求Nutzerdaten auszulesen。
Response.Listener UserDataResponseListener=新的Response.Listener(){
@凌驾
公共void onResponse(字符串响应){
试一试{
JSONObject jsonResponse=新的JSONObject(响应);
boolean success=jsonResponse.getBoolean(“success”);
//Wenn Datenabfrage erfolgreich,JSONResponse auswerten//如果成功,从mysql数据库导入数据
如果(成功){
String responseRealName=jsonResponse.getString(“realname”);if(responseRealName.equals(“”){responseRealName=getResources().getString(R.String.MissingRealName);}
String responseEmail=jsonResponse.getString(“电子邮件”);if(responseEmail.equals(“”){responseEmail=getResources().getString(R.String.MissingEmail);}
String responseStreetName=jsonResponse.getString(“streetname”);if(responseStreetName.equals(“”){resp