4

我有一个可能更笼统的问题,但我在 android dev 期间遇到了它:

我怎样才能最好地分享自己常用的方法?例如,通过键检索共享首选项始终是相同的代码。但是如果我必须在不同的片段或活动中使用它,我总是必须复制相同的代码:

private void setSharedPrefs(String key, String value) {
    SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context);
    SharedPreferences.Editor editor = settings.edit();
    editor.putString(key, value).commit();
}

public static在 GlobalUtils 类中使用它是一个好习惯吗?您将如何处理这些功能?

4

3 回答 3

2

您绝对可以创建一个静态类,例如 GlobalUtils,甚至可以为SharedPreferences. 您只需将 a 传递Context给该方法,以便您可以获取该SharedPreferences对象。你可以把它带到你需要的地方;我已经无数次上了这些课。我什至有一个线程安全的SharedPreferences包装器:-)

编辑:再次查看我的代码,我的一半SharedPreference包装器是静态的,其余的是懒惰地实例化。话虽如此,我认为只要您的其余代码不需要以一种或另一种方式进行,您就应该做任何您觉得舒服的事情。

于 2012-05-20T20:47:57.353 回答
1

是的,您可以将其设为公开静态:

public static void setSharedPrefs(Context context, String key, String value) {
    SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context);
    SharedPreferences.Editor editor = settings.edit();
    editor.putString(key, value).commit();
}

在某些情况下要小心,在活动结束后您可能会保留上下文,这很糟糕。

您描述的更可能的情况是创建这样的类:

public class MyPrefs {

     SharedPreferences settings;
     SharedPreferences.Editor editor;


     public MyPrefs(Context context){
        settings = PreferenceManager.getDefaultSharedPreferences(context);
        editor = settings.edit();
     }

     public void saveName(String name){
          editor.putString("name", name).commit();
     } 

}

您将在扩展 Application 的类中延迟初始化此类,并在其中有一个 getter 来检索它,例如:

 MyPrefs prefs = ((MyAppication) getContext().getApplicationContext()).getMyPrefs();

并像这样使用它:

 prefs.saveName("blundell");

编辑

惰性初始化示例:

private MyPrefs prefs;

public MyPrefs getMyPrefs(){
     if(prefs == null){
          prefs = new MyPrefs(this);
     }
     return prefs;
}

注意这是一个类中的延迟初始化,Application因此扩展this是指您的应用程序上下文,并将在您的应用程序的持续时间内存在。如果您在哪里使用 Activity 上下文,您将不想使用延迟初始化。(所以使用应用程序上下文!

于 2012-05-20T20:51:20.193 回答
0

我通常在不同类的静态方法中编写通用代码。这样我就可以在项目的任何地方调用静态方法,而无需每次都创建新的类对象。

于 2012-05-20T20:50:45.433 回答