Android需要上下文来初始化静态变量

时间:2018-01-04 23:52:44

标签: android static initialization android-context

我需要存储" 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);
}

1 个答案:

答案 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"
    ...