1

我声明了一个非最终静态对象,该对象与我的类中的其他常量一起SharedPreferences调用:PREFSConstants.java

public static SharedPreferences PREFS = null;

我这样做的原因是我的应用程序由大约 6 个不同的应用程序组成,AsyncTasks它们不断访问相同的共享首选项文件,我不想每次都得到SharedPreferences它。Editor在我的应用程序第一次运行时,我调用getSharedPreferences()了 myMainActivity并将其存储到,PREFS以便它在 s 被触发之前指向一个实例AsyncTask,因此避免了NullPointerException.

但是,无论如何,我一直NullPointerException从 s 得到 s 。AsyncTask所有堆栈跟踪都指向我调用Constants.PREFS以获取值的行。我的理论是,一段时间后,Android 会杀死我的应用程序的进程,所以下一次我的任何 s 的警报响起AsyncTask时,值Constants.PREFS已经是null.

我的问题是:我应该为它创建一个静态变量Context吗?即使 Android 终止了我的进程,它的状态是否会持续存在?Context当我的 s 被实例化时,我总是传递对AsyncTasks 的引用,这样他们就可以调用getSystemService(),并且永远不会抛出NullPointerException。但是,我没有看到从 Android 文档Context扩展。Serializable

4

1 回答 1

2

使用Application类在应用程序中全局共享首选项。

public class MyApp extends Application {
    private static Context mAppContext;

    @Override
    public void onCreate() {
        super.onCreate();
        mAppContext = getApplicationContext();
    }

    public static SharedPreferences getPreferences(){
        return mAppContext.getSharedPreferences("my_app_preferences",MODE_MULTI_PROCESS);
    }
}

通过在清单中提及它来告诉 android 你想要你的自定义 Application 类:

<application android:name=".MyApp" android:label="@string/app_name" android:icon="@drawable/ic_launcher">

现在从任何地方,只要打电话

MyApp.getPreferences().edit().putBoolean("pref1",true). . . put more stuff . .commit()

MODE_MULTI_PROCESS确保所有 AsyncTask 线程同步访问SharedPreferences. 此外,commit()它是原子的,并且会将更改持久保存到磁盘。

上述模式对于从任何地方访问资源也很方便。

更新

似乎对上下文的静态引用会导致新Instant Run功能出现问题。

因此,可以需要上下文作为实用程序方法的参数:

public static SharedPreferences getPreferences(context){
    return context.getSharedPreferences("my_app_preferences",MODE_MULTI_PROCESS);
}
于 2012-10-29T05:12:30.530 回答