【问题标题】:Get string from SharedPreferences in AsyncTask从 AsyncTask 中的 SharedPreferences 获取字符串
【发布时间】:2016-12-21 11:47:10
【问题描述】:

我正在尝试开发一个发送电子邮件的应用程序,实际上我刚开始学习java。

我在共享首选项中创建了字符串“email_address”和“pass”,以便用户可以更改它们。然后我尝试使用该数据发送电子邮件-->

  //Creating a new session
    session = Session.getDefaultInstance(props,
            new javax.mail.Authenticator() {
                //Authenticating the password
                protected PasswordAuthentication getPasswordAuthentication() {

                    return new PasswordAuthentication(sharedPrefs.getString("email_address", "a"), sharedPrefs.getString("pass", "a")); }
            });

    try { <...>   

然后我得到了这个:

原因:java.lang.NullPointerException:尝试在空对象引用上调用接口方法“java.lang.String android.content.SharedPreferences.getString(java.lang.String, java.lang.String)”

Android Studio 将我指向这一行 -->

return new PasswordAuthentication(sharedPrefs.getString("email_address", "a"), sharedPrefs.getString("pass", "a")); }    

如果我在该行中硬编码我的 gmail 和密码,它可以完美运行,但我需要一个选项来更改这些(以防用户无法从我的源代码构建此应用程序)。请帮忙,我已经花了 3 个小时浏览这个网站和 androiddevelopers。 :(

【问题讨论】:

  • 您是否通过从context 获取sharedPrefs 来初始化它?
  • 因为是学Java,所以一定要知道什么是空指针以及如何解决:stackoverflow.com/questions/218384/…
  • 正如@AndiGeeky 所说,您的sharedPrefs 变量未初始化。这就是问题所在。
  • 我有这个公共类 SendMail extends AsyncTask { SharedPreferences sharedPrefs;
  • @adalPaRi 我搜索了这个,似乎它必须在 onCreate 中初始化,但我在这个类中没有 oncreate。

标签: java android nullpointerexception sharedpreferences


【解决方案1】:

确实不建议在您的sharedPreferences 中保存任何形式的密码,如果您正在创建一个应用程序,您希望用户选择他们想要从哪里发送密码,例如他们自己的个人 Gmail 使用 Intents 代替,但如果您确定自动发送电子邮件,我建议您设置一个 Gmail SMTP 电子邮件地址,以便从那里发送并通过那里将用户名和密码传递给您的身份验证器。 (Java 邮件 API)

电子邮件意图示例:Send Email Intent

但如果您想自动发送电子邮件:Example of sending email using Java Mail API

【讨论】:

    【解决方案2】:

    根据您的相关评论:

    首先,这是什么都不做,因为方法里面的变量是本地的:

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        //get sharedPreferences here
        SharedPreferences sharedPreferences = getSharedPreferences(PreferenceManager.getDefaultSharedPreferences(this);
    }
    

    然后,一种解决方案可能是,在使用构造函数初始化 AsyncTask 时初始化 SharedPreferences:

    public SendMail(Context context, String email, String subject, String sharedText1) {
        //Initializing variables
        Context context1 = context; // this line is doing nothing..
        this.email = email;
        this.subject = subject;
        this.sharedText1 = sharedText1;
        sharedPrefs = context.getSharedPreferences("MySharedPreferences", Context.MODE_PRIVATE); // add this line to initialize variable
    }
    

    最后,您可以访问 sharedPrefs 变量而不会出现空指针异常:

    sharedPrefs.getString("email_address", "a")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-30
      相关资源
      最近更新 更多