2014-05-11 19 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,我把这种从。