2017-07-27 34 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 
    } 
相關問題