簡體   English   中英

從AsyncTask中的SharedPreferences獲取字符串

[英]Get string from SharedPreferences in AsyncTask

我正在嘗試開發用於發送電子郵件的應用程序,實際上我剛剛開始學習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。 :(

確實不建議在您的sharedPreferences保留任何形式的密碼,如果您正在創建一個應用程序,希望用戶選擇他們想要從其中發送密碼的位置,例如使用自己的個人Gmail,請使用Intents代替。如果確定要自動發送電子郵件,建議您設置一個Gmail SMTP電子郵件地址以從中發送,並將用戶名和密碼通過該地址傳遞給您的Authenticator。 (Java郵件API)

電子郵件意圖示例: 發送電子郵件意圖

但是如果您想自動發送電子郵件:使用Java Mail API發送電子郵件的示例

從您有問題的評論中詢問:

首先,由於該方法內部的變量是LOCAL,因此無濟於事:

@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")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM