【问题标题】:How do I get sharedpreferences in Asynctask?如何在 Asynctask 中获得共享首选项?
【发布时间】:2014-05-11 19:21:42
【问题描述】:

我正在为我的学校项目编写一个 android 应用程序,但我被困在这里。问题是我必须访问 SharedPreferences 值并在 AsyncTask 类中需要它。当我尝试访问它时,由于上下文,它不会让我访问。如何在我的AsyncTask 中联系我的SharedPreferences

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


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

        //Trying to get sharedpreferences here wont work.

        return null;
    }

}

【问题讨论】:

  • 我的意思是访问其中的值。
  • 我认为您不能从AsynTask 访问sharedPreference,至少在doInBackGround 中是这样。您是否尝试过从onPreExecute 访问它?
  • 只需将您需要的值传递给 AsyncTask,可能在构造函数中。您甚至可以传入上下文,但我不会在 doInBackground() 中访问它,因为它可能不安全。
  • 我试过了:SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);但它给了我错误:PreferenceManager 类型中的方法 getDefaultSharedPreferences(Context) 不适用于参数 (CheckAccess)

标签: java android android-asynctask sharedpreferences


【解决方案1】:

覆盖AsyncTaskonPreExecuteonPostExecute 方法并在此处获取SharedPreferences

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

请注意getSharedPreferences 是一个Activity 方法。所以,如果你没有在Activity中使用它,你需要通过Context调用它。

【讨论】:

  • 好主意,但我无法获得它。如何在 preExecute 中继续这一行? SharedPreferences 首选项 = ...
  • 我认为问题在于我没有通过 Context 调用它,因为我没有在活动中使用它。我该怎么做?
  • 只需将上下文传递给AsynTask 构造函数。
  • 恐怕这个答案是错误的。请参阅tlahoda's answer for a summarymy answer for a more detailed explanation
  • @RichardLeMesurier:感谢您的纠正。我完全错过了。我已经更正了我的答案
【解决方案2】:

您可以像这样使用 PreferenceManager 在后台线程中获取 SharedPreferences:

SharedPreferences 首选项 = PreferenceManager.getDefaultSharedPreferences(.this);

【讨论】:

    【解决方案3】:

    您可以使用AsyncTask 在后台获取SharedPreferences

    错误就在这一行,你传入了错误类型的变量:

    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
    

    在您的情况下,单词this 指的是您调用的AsyncTask 实例。


    我所做的是将Context 传递给execute() 方法中的任务。请参阅下面的代码以获取工作示例:

        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);
    

    在上面的示例中,this 指的是我调用它的 ActivityService

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-17
      • 1970-01-01
      • 1970-01-01
      • 2012-09-08
      相关资源
      最近更新 更多