我需要存储" size"的值。在一个静态变量中。 问题是:包含此代码的类是一个静态类,我存储变量,想法是只执行一次这个代码,你可以每个对象执行一次,但它意味着成千上万次(有一千个类的对象)这需要价值)。 有没有办法只使用上下文值加载值一次,就好像它是一个静态块?
private static Point size;
public static float getProportion(Context context) {
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = windowManager.getDefaultDisplay();
size = new Point();
display.getSize(size);
}
答案 0 :(得分:1)
如果您只希望将尺寸值初始化一次,则可以“懒洋洋地”'初始化它:
private static Point size = null;
public static Point getProportion(Context context) {
if (size == null) {
WindowManager windowManager = (WindowManager)
context.getSystemService(Context.WINDOW_SERVICE);
Display display = windowManager.getDefaultDisplay();
size = new Point();
display.getSize(size);
}
return size;
}
这仍然需要您传入Context
个对象。解决这个问题的唯一方法是使用静态Context
,这通常是一个非常糟糕的主意,因为静态Contexts
通常意味着内存泄漏(如果Context
属于Activity
或者Service
需要在应用程序的整个生命周期内进行清理)
你可以做的是创建一个Application
类,并保持静态Application
Context
:( Psuedo代码)
public class MyApplication extends Application {
public static Context context;
@Override
public void onCreate() {
this.context = this;
}
}
现在您可以在Application
中使用静态Context
getProportion()
:
public static Point getProportion() {
if (size == null) {
WindowManager windowManager = (WindowManager)
MyApplication.context.getSystemService(Context.WINDOW_SERVICE);
...
从内存泄漏的角度来看,有一个静态的Application
Context
是可以的,因为这个Context
存在于你应用的Application
类中,意思是只要您的应用程序存在,它就会存在 - 它永远不需要清理。
不要忘记在清单中注册您的Application
课程:
<manifest
...
<application
android:name=".MyApplication"
...