【问题标题】:How do I access Android SharedPreferences from a static method in a class without passing in a context reference?如何在不传入上下文引用的情况下从类中的静态方法访问 Android SharedPreferences?
【发布时间】:2017-07-27 20:06:02
【问题描述】:

我只有一个类需要访问 SharedPreferences:

public class MyUtils {

    public static String packageMe(Object input){
        // do stuff here
        // need SharedPreferences here
    }

    public static Object unpackageMe(String input){
        // do stuff here
        // need SharedPreferences here
    }
}

我试过这个:

public class MyUtils extends Activity

但是,如您所知,我无法从静态方法访问 SharedPreferences。

我曾考虑将上下文传递给静态方法,但这会将我需要修改的类数量扩展到四个,并且这些类已经在扩展 AsyncTask:

public class SomeClass01 extends AsyncTask {
    @Override
    protected Object doInBackground(Object[] params){
        MyUtils.packageMe(abc_123_object);
        // do stuff here
    }
}

所以,我想也许我可以将上下文传递给这四个类。但是,我需要修改几十个使用这四个类的类,而这些类又使用单个类。

public class SomeTopClass extends FragmentActivity implements x, y, z {
    new SomeClass01.execute(abc_123_object);
    // do stuff here
}

我不知道我是否想将上下文引用传递到我的代码中。

我在 StackOverflow 上看到了关于在我的 abc_123_object 模型中添加对 SharedPreferences 的引用,但是我使用了很多对象(除了 abc_123_object),我不希望 jerry-rig 这么多类。

那么,有没有办法让我在不修改几十个类并在我的代码周围传递上下文引用的情况下做到这一点,还是我被卡住了?

谢谢

【问题讨论】:

  • @Dusan WOAH ... 太甜了!!!这“安全”吗?
  • 根据我的经验,是的,它是安全的。在几个应用程序中使用了这种方法 - 异步任务、后台线程,都使用相同的静态上下文,没有问题。
  • 只要确保在初始化之前不要调用使用静态上下文的代码。
  • 如果您想在活动之间更轻松地传递数据,您可以查看 EventBus

标签: android static-methods android-sharedpreferences


【解决方案1】:

在您的应用程序类中创建静态变量。

public class MyApp extends Application{
    public static Context context;
@Override
    public void onCreate() {
    context = this;
    }
}

然后在需要时使用它。

public static String packageMe(Object input){
        // do stuff here
        // need SharedPreferences here
        // context = MyApp.context
    }

【讨论】:

    【解决方案2】:

    正如 Dusan 所说,使用应用程序类是一种简单的方法:

    在您的应用程序类中:

    private static MyApplication sInstance = null;
    
    private SharedPreferences mPrefs
    
    public static MyApplication getApp()
    {
        return sInstance;
    }
    
    public SharedPreferences getSharePreferences()
    {
        return mPrefs;
    }
    

    onCreate():

    sInstance = this;
    mPrefs = getSharedPreferences(PREF_FILE, MODE_PRIVATE);
    

    然后在你的代码中简单地做:

    MyApplication.getApp().getSharePreferences();
    

    您的应用程序的 onCreate() 保证会在任何活动创建之前执行,因此除非您正在做一些非常奇怪的事情,否则它应该是安全的。

    【讨论】:

      猜你喜欢
      • 2015-01-18
      • 2012-07-01
      • 2012-11-12
      • 2021-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-03
      相关资源
      最近更新 更多