当启动应用程序时,希望在重新定义的应用程序中将对自身的引用存储在静态字段中,以便于访问实际上下文、配置和资源 ID。
这对于内存泄漏有多重要?
public class MainApplication extends Application {
/**
* Название главных настроек
*/
private static final String SETTINGS_NAME = "erfecdcdvqefvwe";
//Для реализации ссылки на приложение
private static MainApplication instance;
/**
* Стартует при зауске приложения
*/
@Override
public void onCreate() {
super.onCreate();
//Сохраняем ссылку на этот класс
instance = this;
}
/**
* Вернуть ссылку на приложение
*/
public static MainApplication getInstance(){
return instance;
}
/**
* Главные настройки приложения
*/
public static SharedPreferences getSettings(){
return getInstance().getSharedPreferences(SETTINGS_NAME, MODE_PRIVATE);
}
public static Context getAppContext(){
return getInstance().getApplicationContext();
}
/**
* Получить цвет из ресурсов
*/
public static ColorDrawable getResColor(int resId){
return new ColorDrawable(ContextCompat.getColor(MainApplication.getInstance().getApplicationContext(), resId));
}
/**
* Пиксели в DP
*/
public static float dpFromPx(float px) {
return px/ getAppContext()
.getResources()
.getDisplayMetrics()
.density;
}
/**
* DP в пиксели
*/
public static float pxFromDp(float dp) {
return dp * getAppContext()
.getResources()
.getDisplayMetrics()
.density;
}
}
一切都很好,如果需要,您可以这样做。
抱歉,我会给你一个额外的代码回调,毕竟这就是社区的用途:
Application类必须为空。没有通用的静态方法(dpFromPx、pxFromDp getResColor)——将它们移动到单独的类中。应用程序应该只有单例初始化(很少有例外,如 Thread.UncaughtExceptionHandler)。
切换到 Kotlin。我看不出有任何理由学习在 java 上为 android 编写代码。Kotlin 与 Java 并没有太大的不同。这将为您提供大量语法糖和有益的开发经验。
用英文写评论。谁在你之后看代码,你肯定会理解代码的注释,同时你会提高你的语言。另外,将来在任何环境或编辑器中打开拉丁代码,它肯定会正确显示。
我希望你积极地接受建设性的批评。
不重要。
Application在应用程序期间存在,并且仅在应用程序死亡时死亡。Application不能在多个实例中存在,这意味着不会有内存泄漏。缺点是不能保证
onCreate()在一些静态初始化代码尝试获取您的Context. 这意味着您的调用代码必须准备好使用null值。然而,即使在严肃的项目中也使用这种方法。总的来说,这是一个非常常见的解决方案。
如果有单例模式怎么办。我建议你看看它。
他的想法很简单。为类创建单个实例并将其引用存储在静态变量中。由于没有泄漏并且它没有这样的减号,我建议您仔细研究这种模式并得出结论。