【问题标题】:android Sharedpreferences non-activity classandroid Sharedpreferences 非活动类
【发布时间】:2021-08-12 10:22:16
【问题描述】:
private static String geturl() {
        Context applicationContext = configActivity.getContextOfApplication();
//        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(applicationContext);

        SharedPreferences prefs =applicationContext.getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE);
        String url = prefs.getString("url", "No name defined");
        return url;
    }

此方法在非活动类中 我试图从非活动类中获取我的字符串 我试着像有人说的那样做:Android - How to use SharedPreferences in non-Activity class?

但我有这个错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.SharedPreferences android.content.Context.getSharedPreferences(java.lang.String, int)' on a null object reference

【问题讨论】:

  • 通过构造函数传递活动的上下文,然后在您的类中引用该上下文

标签: java android class sharedpreferences


【解决方案1】:

问题出在第一行代码,getContextOfApplication()方法返回了一个空值:

上下文 applicationContext =configActivity.getContextOfApplication();

由于 Context 可能已经到了其生命周期的尽头,因此一般建议不要将 Context 或 Activity 对象存储为静态变量,因为这可能会导致内存泄漏。相反,您应该将 Context 或 Activity 包装在 WeakReference 中,并在需要时检查展开后上下文是否不为空。

在下面的示例中,活动被存储为 WeakReference,并在需要时使用 postExecute() 方法中的 get() 解包。由于活动可能在 AsyncTask 结束之前已经结束,因此可以确保没有内存泄漏和 NullPointer 异常。

private class MyAsyncTask extends AsyncTask<String, Void, Void> {

    private WeakReference<Activity> mActivity;

    public MyAsyncTask(Activity activity) {
        mActivity = new WeakReference<Activity>(activity);
    }

    @Override
    protected void onPreExecute() {
        final Activity activity = mActivity.get();
        if (activity != null) {
            ....
        }
    }

    @Override
    protected Void doInBackground(String... params) {
        //Do something
        String param1 = params[0];
        String param2 = params[1];
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        final Activity activity = mActivity.get();
        if (activity != null) {
            activity.updateUI();
        }
    }
} 

【讨论】:

  • 加上这个类后我该怎么办
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-14
  • 2012-09-23
  • 1970-01-01
相关资源
最近更新 更多