如何在不传入上下文引用的情况下从类中的静态方法访问Android SharedPreferences?

时间:2017-07-27 20:06:02

标签: android static-methods android-sharedpreferences

我只有一个课程,我需要访问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。

那么,有没有办法让我在不修改数十个类的情况下执行此操作并在代码周围传递上下文引用,或者我被卡住了?

由于

2 个答案:

答案 0 :(得分:0)

正如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()保证在创建任何活动之前执行,所以除非您做的事情非常奇怪,否则应该是安全的。

答案 1 :(得分:0)

在Application类中创建静态变量。

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
    }