2017-07-27 109 views
1

我只有一个班,我需要访问SharedPreferences:如何在不传递上下文引用的情况下从类中的静态方法访问Android 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),我不想让这么多类。

那么,有没有办法让我做到这一点,而无需修改几十个类,并在我的代码周围传递上下文引用,或者我卡住了?

感谢

+1

看看的:https://stackoverflow.com/a/5114361/461810 – Dusan

+0

@Dusan哇...这是非常甜蜜!这是“安全”吗? – Brian

+0

从我的经验来看,是的,这是安全的。 在一些应用中使用这种方法 - 异步任务,后台线程,全部使用相同的静态上下文,没有问题。 – Dusan

回答

0

正如杜尚所提到的,使用应用程序类是一个简单的方法来做到这一点:

在您的应用程序类:

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()被保证在任何活动被创建之前被执行,所以除非你做的事情真的很奇怪,它应该是安全的。

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 
    } 
相关问题