设置SharedPreferences时获取NullPointerException

时间:2014-10-09 13:17:53

标签: java android sharedpreferences

我正在尝试在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)

5 个答案:

答案 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)

sharedpreferencesnull。你在这里声明

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);
}