【问题标题】:android context and sharedpreferencesandroid 上下文和共享首选项
【发布时间】:2015-04-22 07:44:33
【问题描述】:

我正在尝试获取上下文以运行异步共享首选项。试图通过以下方式获取上下文:

public class MainActivity2 extends Activity implements OnClickListener {
    public MainActivity2(final Context context) {
        this.context = context;
    }
    private Context context;

    //....rest of class.....
}

但是,当它被包含时,应用程序会崩溃。但是需要类似的东西来获得共享首选项:

class CreateUser extends AsyncTask<String, String, String> {
    // .....rest of ....
    @Override
    protected String doInBackground(String... args) {
        SharedPreferences prefs =   android.preference.PreferenceManager.getDefaultSharedPreferences(context);
        String myIntegerValue = prefs.getString("ok", "f");
        android.util.Log.d("your_tag", "myint: " + myIntegerValue);
    }
    //rest of.....
}

尝试像这样获取共享首选项不起作用:

SharedPreferences prefs = android.preference.PreferenceManager.getDefaultSharedPreferences(getactivity());

尝试像这样获取共享首选项不起作用:

SharedPreferences prefs = android.preference.PreferenceManager.getDefaultSharedPreferences(this);

getDefaultSharedPreferences 在使用这个时不能应用到 MainActivity2.CreateUser

【问题讨论】:

  • 你在异步任务中获得偏好吗?

标签: java android sharedpreferences android-preferences


【解决方案1】:

在 asynctask 中使用共享首选项时,您应该在 onPreExecute 方法中将所有数据从 sharedprefs 获取到本地变量,在 doInBackground 中使用它们,如果需要更新这些值,请在 onPostExecute 中执行。

如果你在同一个类中使用异步任务,你不需要在任何地方显式声明上下文。你可以写 Classname.this。

实现它的更好方法是在 oncreate 中初始化您的 sharedprefs,因为您可以在任何地方使用它。

如果您在不同的类中编写 aynctask,那么您可以编写一个接受上下文并调用 asynctask 执行的函数。

【讨论】:

    【解决方案2】:

    但是,当它被包含时,应用程序会崩溃。但需要类似的东西 去共享首选项:

    Activity 扩展 ContextWrapper。您不需要(也不能拥有)将上下文作为参数的构造函数。您在活动中的上下文是关键字this。如果您在片段中需要它,您可以使用getActivity() 来检索托管Fragment 的活动的上下文。

    编辑:

    在你的情况下,你必须有可能性。您添加一个构造函数,将Context 传递给AsyncTask,或者您读取Activity 中的值并将其传递给AsyncTask。我会推荐你​​第二种方法

    【讨论】:

    • 当我在 SharedPreferences prefs = android.preference.PreferenceManager.getDefaultSharedPreferences(this);它不起作用。
    • SharedPreferences 首选项 = android.preference.PreferenceManager.getDefaultSharedPreferences(getactivity());也不行
    • 在第一种情况下。显然你没有使用Fragment,所以你不能使用getActivity
    • getDefaultSharedPreferences 在使用这个时无法应用于 MainActivity2.CreateUser
    • MainActivity2.this 一起使用。 this 关键字,在您的情况下是指 AsyncTask 的子类
    【解决方案3】:

    试试这个:

    SharedPreferences prefs = android.preference.PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext());
    

    SharedPreferences prefs = android.preference.PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
    

    【讨论】:

    • @JamesShelton 欢迎您,我认为 SharedPreferences prefs = android.preference.PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 也适合您。
    【解决方案4】:

    只需将您的活动用作上下文 MainActivity.this 应该做的伎俩

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-20
      • 2012-09-03
      • 1970-01-01
      相关资源
      最近更新 更多