2014-05-11 22 views
3

我正在爲我的學校項目編寫一個android應用程序,但我被困在這裏。問題是我必須訪問一個SharedPreferences值,並需要它在AsyncTask類。當我嘗試訪問它時,由於上下文,它不會讓我。如何在我的AsyncTask中達到我的SharedPreferences如何在Asynctask中獲得共享首選項?

public class CheckAccess extends AsyncTask<JSONObject, Integer, Boolean>{ 


    @Override 
    protected Boolean doInBackground(JSONObject... params) { 

     //Trying to get sharedpreferences here wont work. 

     return null; 
    } 

} 
+0

我的意思是訪問它的值。 – user3316779

+0

我想你不能從'AsynTask'中訪問'sharedPreference',至少在'doInBackGround'中。你有沒有試過從'onPreExecute'訪問它? – elbaulp

+0

只需將您需要的值傳遞給AsyncTask,可能在構造函數中。你甚至可以傳入上下文,但是我不會在'doInBackground()'中訪問它,因爲它可能不是威脅安全的。 – 323go

回答

6

覆蓋onPreExecuteAsyncTaskonPostExecute方法,並得到SharedPreferences有:

@Override 
protected void onPreExecute() { 
    super.onPreExecute(); 
    //get sharedPreferences here 
    SharedPreferences sharedPreferences = getSharedPreferences(<SharedPreferencesName>, <Mode>); 
} 

請注意:getSharedPreferencesActivity方法。所以,如果你沒有在Activity中使用它,你需要通過Context來調用它。

+0

好主意,但我有麻煩得到它。如何在preExecute中繼續這一行? SharedPreferences prefs = ... – user3316779

+0

查看更新的答案 –

+0

我認爲問題在於我沒有通過Context調用它,因爲我沒有在活動中使用它。我該怎麼做? – user3316779

2

您可以使用PreferenceManager這樣的後臺線程獲得SharedPreferences:

SharedPreferences首選項= PreferenceManager.getDefaultSharedPreferences(<YourActivity>。本);

2

您可以使用AsyncTask在後臺獲取SharedPreferences

錯就錯在這條線,你在哪裏傳遞了錯誤類型的變量:

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 

在你的情況,這個詞thisAsyncTask例如您如果來自調用。


我做的是我通過Context中的​​方法的任務。見下面的代碼爲一個工作示例:

new AsyncTask<Context, Void, String>() 
    { 
     @Override 
     protected String doInBackground(Context... params) 
     { 
      Context context = params[0]; 
      SharedPreferences prefs = 
        context.getSharedPreferences("name of shared preferences file", 
          Context.MODE_PRIVATE); 

      String myBackgroundPreference = prefs.getString("preference name", "default value"); 

      return myBackgroundPreference; 
     } 

     protected void onPostExecute(String result) 
     { 
      Log.d("mobiRic", "Preference received in background: " + result); 
     }; 

    }.execute(this); 

在上述例子中,thisActivityService,我把這種從。