我正在尝试在SharedPrefences
方法中设置onPostExecute
但我在错误日志中得到NullPointerException
。我试图把它doInBackground()
但是阻止我的结果返回。所以这是代码
我的任务类
public class LoginTask extends AsyncTask<Void, Void, String> {
private final String mEmail;
private final String mPassword;
private SharedPreferences sharedpreferences;
private final String MyPREFERENCES = "session" ;
String url = ****
LoginTask(String email, String password) {
mEmail = email;
mPassword = password;
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@Override
public String doInBackground(Void... params) {
// TODO: attempt authentication against a network service.
try {
// Simulate network access.
Thread.sleep(2000);
} catch (InterruptedException e) {
return "false";
}
ArrayList<BasicNameValuePair> nameValuePairs = new ArrayList<BasicNameValuePair>();
nameValuePairs.add(new BasicNameValuePair("email", mEmail));
nameValuePairs.add(new BasicNameValuePair("password", mPassword));
//Prepare the Post query
try {
HttpClient clientHttp = new DefaultHttpClient();
HttpPost httppost = new HttpPost(url);
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = clientHttp.execute(httppost);
HttpEntity entity = response.getEntity();
InputStream is = entity.getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
StringBuilder sb = new StringBuilder();
String line = reader.readLine();
sb.append(line + "\n");
is.close();
String result = sb.toString();
System.out.println(result);
return result;
}catch (Exception e){
return null;
}
}
@Override
protected void onPostExecute(final String res) {
try {
jObj = new JSONObject(res);
} catch (JSONException e) {
e.printStackTrace();
}
try {
if (jObj.getString("code").equals("1")) {
SharedPreferences.Editor e = sharedpreferences.edit();
e.putString(MyPREFERENCES,"active");
e.commit();
Intent myIntent = new Intent(getActivity(), HomesActivity.class);
//Lançer l'activité
startActivityForResult(myIntent, 0);
} else {
//password.setError(getString(R.string.error_incorrect_password));
//password.requestFocus();
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("Error !");
builder.setMessage("The information entered is incorrect.\nPlease try again!")
.setCancelable(false)
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
AlertDialog alert = builder.create();
alert.show();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
protected void onCancelled() {
LoginTask = null;
//showProgress(false);
}
}
我的错误记录:
10-09 12:58:50.088 2878-2878/com.example.user.unchained E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.example.user.unchained, PID: 2878
java.lang.NullPointerException
at com.example.user.unchained.EmailLoginActivity$LoginTask.onPostExecute(EmailLoginActivity.java:328)
at com.example.user.unchained.EmailLoginActivity$LoginTask.onPostExecute(EmailLoginActivity.java:255)
at android.os.AsyncTask.finish(AsyncTask.java:632)
at android.os.AsyncTask.access$600(AsyncTask.java:177)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5017)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)
答案 0 :(得分:1)
您好在代码中找不到sharedpreferences对象的初始化。
sharedpreferences = getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE);
或
sharedpreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
然后你不会得到空指针Exception。
答案 1 :(得分:1)
当您调用sharedpreferences
时,null
可能是edit()
。
您发布的代码中没有初始化的迹象。
答案 2 :(得分:1)
您必须在此处初始化共享首选项sharedpreference为null。使用SharedPreferences sharedpreferences = getSharedPreferences(PREFERENCE_NAME,Context.MODE_PRIVATE);
答案 3 :(得分:1)
sharedpreferences
是null
。你在这里声明
private SharedPreferences sharedpreferences;
但是在尝试使用它之前你永远不会初始化它(给它一个值)
SharedPreferences.Editor e = sharedpreferences.edit();
在该行之前,您需要类似
的内容sharedpreferences = getSharedPreferences("myPref", 0);
但为此您需要Context
。因此,如果这是一个单独的类,那么您需要将Context
的{{1}}传递给Activity
构造函数。
因此,您需要创建类AsyncTask
之类的类变量,然后将构造函数更改为
Context mContext;
然后在调用此任务时,将活动上下文以及电子邮件和密码与LoginTask(String email, String password, Context c) {
mEmail = email;
mPassword = password;
mContext = c;
}
或this
或其他内容一起传递,具体取决于调用的方式/位置。
现在,当您初始化ActivityName.this
对象时,它将是
SharedPreference
答案 4 :(得分:1)
sharedpreferences
永远不会被初始化。
也许是这样的:
LoginTask(Context context, String email, String password) {
mEmail = email;
mPassword = password;
sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context);
}