【问题标题】:will there be memory leak or the best way for storing global variables?会有内存泄漏或存储全局变量的最佳方式吗?
【发布时间】:2015-03-15 09:40:10
【问题描述】:

对于这个问题,主要关注的是什么是最好的方法。在我的 android 应用程序中,Application 类被子类化主要有两个原因,

1)、维护整个应用程序的全局状态,

2),能够在非活动类中初始化和使用 SharedPreferences。

代码有点像这样,

public class GlobalApp extends Application {

    private static GlobalApp instance;
    private Bitmap bitmap;

    @Override
    public void on create(){
        super.on create();
        instance = this;
    }

    public static GlobalApp getInstance() {
        return instance;
    }

    public void setBitmap(Bitmap b) {
       this.bitmap = b;
    }
}

如您所见,在非活动类中访问应用程序上下文,它被视为静态,而其他字段只是实例变量,我们在其中存储位图,会导致内存泄漏吗? 以上方法是最好的吗?或者它可以做得比这更好?

请帮忙。

【问题讨论】:

  • @Apurva 谢谢,但请你帮我解决我的困惑,请。

标签: android memory-leaks global-variables best-in-place


【解决方案1】:

我没有看到任何可能导致内存泄漏的东西。但是,您不需要像那样存储和检索实例,您可以这样做:

GlobalApp app = ((GlobalApp)this.getApplication());  

只需确保将应用程序类名称添加到清单中即可。还要记住,没有内存泄漏并不意味着没有内存问题。如果您在该应用程序对象中持有过多的内存,您的应用程序可能会因 OutOfMemoryError 而崩溃。根据您的确切需求,您可能需要使用弱引用来避免这种情况。有关使用 Application 类的更多信息:Using the Android Application class to persist data

【讨论】:

  • 谢谢,非常感谢您的建议。顺便说一句,我遵循的方式与您在回答中提到的方式相同。但我担心的是让静态实例在 nob 活动类中访问它。它是否正确?或者我应该从应用程序中删除静态实例。
  • 我会删除静态实例。我怀疑这会导致问题,但没有必要。
  • 那么,你是说对于非活动类,我必须通过调用它的构造函数而不是静态方式来传递上下文?
  • 如果您的意思是如何从活动类外部访问应用程序,是的,您必须传入一些东西。
猜你喜欢
  • 2010-10-01
  • 1970-01-01
  • 2023-03-28
  • 2013-10-13
  • 2012-01-29
  • 1970-01-01
  • 2012-11-04
  • 2019-01-08
  • 1970-01-01
相关资源
最近更新 更多