我在SharedPreferences
类中声明了一个名为PREFS
的非最终静态Constants.java
对象和其他常量:
public static SharedPreferences PREFS = null;
我这样做的原因是我的应用程序由大约6个不同的AsyncTasks
组成,这些SharedPreferences
继续访问相同的共享prefs文件,我不想得到Editor
及其{{ 1}}每一次。在我的应用首次运行时,我会在getSharedPreferences()
中拨打MainActivity
并将其存储到PREFS
,以便在AsyncTask
被触发之前指向实例,因此避免使用NullPointerException
。
但是,无论如何,我始终从NullPointerException
获得AsyncTask
s。所有堆栈跟踪指向我调用Constants.PREFS
以获取值的行。我的理论是,经过一段时间后,Android会终止我的应用程序流程,因此下次我AsyncTask
的任何警报发出警报时,Constants.PREFS
的值都会为null
。
我的问题是:我应该为Context
创建一个静态变量吗?即使Android取消了我的流程,它的状态也会持续存在吗?当后者被实例化时,我总是将Context
的引用传递给我的AsyncTask
,以便他们可以调用getSystemService()
,并且永远不会抛出NullPointerException
。但是,我没有看到Context
从Android文档扩展Serializable
。
答案 0 :(得分: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);
}