首先,我的代码看起来像这样。数据中心类需要上下文才能到达SharedPreference。
class App extends Application
{
private DataCenter dataCenter;
@Override
public void onCreate() {
super.onCreate();
dataCenter = new DataCenter(this);
}
}
当我在我的活动中使用dataCenter时,我必须使用getApplicationContext()并转换为我的应用程序,然后获取dataCenter对象。
然后我搜索了stackoverflow,并意识到我可以让App有一个静态字段来引用它自己。
class App extends Application
{
private DataCenter dataCenter;
public static App me;
@Override
public void onCreate() {
super.onCreate();
App.me = this;
dataCenter = new DataCenter(this);
}
}
通过这样做,我不再需要调用getApplicationContext()并在我的activity类中进行转换,只需要App.me.getDataCenter()。而且在App的构造函数中,我甚至可以不将上下文传递给dataCenter的consctrutor,而只是直接在DataCenter类中引用App.me.
(Q1)我想知道我在做什么是好的,这里有任何风险吗?
之后,我意识到我是否想在我的活动中使用dataCenter," App.me.getDataCenter()"对我来说还是太长了
(Q2)我可以将DataCenter类设置为静态,因为它可以访问App.me以静态获取上下文吗?
(Q3)静态类与android的应用程序具有相同的生命周期?并且Application类总是首先出现?
答案 0 :(得分:1)
首先,最好以改变可变的范围me
私人,其名称改为一个更好和更描述性的(例如instance
),并创建get()
方法,该方法将返回Application的实例。当你把这个变量公开时,可以改变它,我想你不想要它。
(Q1)我想知道我在做什么是好的,这里有任何风险吗?
之后,我意识到我是否想在我的活动中使用dataCenter, “App.me.getDataCenter()”对我来说还太长了
我认为,您应该使用SharedPreferences
类的一个实例。如果DataCenter
使用SharedPreferences
,则不应混合应用和活动的上下文。您应该选择一个上下文并继续使用它。在我看来,应用程序的上下文是一个更好的选择,因为您可能希望在许多活动中使用此对象。此外,您无需每次在活动中致电App.me.getDataCenter()
。只需将它传递给Application类。
(Q2)我可以将DataCenter类设置为静态,因为它可以访问 App.me静态获取上下文?
你可以,但你应该避免静态类。使用静态类时,为应用程序编写单元测试更加困难。此外,在加载类时,不会选择静态对象进行垃圾回收。这意味着,您的应用程序将消耗更多的设备内存,效率会降低。
(Q3)是静态类与android的Application具有相同的生命周期 ?并且Application类总是首先初始化?
在使用派生自Application类的类中的静态变量时,应用程序的生命周期不应更改。