繁体   English   中英

设置SharedPreferences时获取NullPointerException

[英]Getting NullPointerException while setting SharedPreferences

我试图在我的onPostExecute方法中设置SharedPrefences ,但是我在错误日志中得到了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)

嗨,在您的代码中,我找不到sharedpreferences对象初始化。

sharedpreferences = getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE);

要么

sharedpreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());

这样就不会得到空指针异常。

调用edit()时,您的sharedpreferences可能为null

您发布的代码中没有初始化的迹象。

您必须在此处初始化sharedpreference sharedpreference为null。 使用SharedPreferences sharedpreferences = getSharedPreferences(PREFERENCE_NAME,Context.MODE_PRIVATE);

sharedpreferencesnull 你在这里声明

private  SharedPreferences sharedpreferences;

但是在尝试在此处使用它之前,您永远不要初始化它(给它一个值)

SharedPreferences.Editor e = sharedpreferences.edit();

在那行之前,您需要

sharedpreferences = getSharedPreferences("myPref", 0); 

但是为此,您将需要一个Context 因此,如果这是一个单独的类,则需要将ActivityContext传递给AsyncTask构造函数。

因此,您将需要创建一个像Context mContext;这样的类变量Context mContext; 然后将您的构造函数更改为

LoginTask(String email, String password, Context c) {
    mEmail = email;
    mPassword = password;
    mContext = c;
}

然后,在调用此任务时,将活动上下文以及带有thisActivityName.this的电子邮件和密码以及其他内容(取决于调用方式/位置)一起传递。

现在,当您初始化SharedPreference对象时,它将是

sharedpreferences = mContext.getSharedPreferences("myPref", 0); 

sharedpreferences从未初始化。

也许是这样的:

LoginTask(Context context, String email, String password) {
    mEmail = email;
    mPassword = password;
    sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM