android 静态类引用上下文内存泄漏,可以在辅助类中使用上下文导致android中的内存泄漏...

TL; DR - 严格地说是上面的情况,不,因为在“onCreate”中MyActivity不会被销毁

答案很长:

通常,当垃圾收集器运行时,当某个对象无法进行垃圾回收时会发生内存泄漏,因为某些对象仍然引用它。

在您的情况下,刚刚创建活动,主要关注的是泄漏是否可能发生,因为HelperClass包含对它的引用。

首先,在正常情况下(除了AOS可能会杀死你的应用程序)MainActivity保证在调用onDestroy方法之前不会收集垃圾。这是因为在那之前(并且可能在那之后的一段时间 - 不相关)它将被Android框架本身引用。

另一方面,

HelperClass是onCreate内的局部变量。完成onCreate后,HelperClass可能会在任何时候被垃圾收集,因为它没有引用它的任何对象(请参阅here)。因此HelperClass之前调用onDestroy的机会非常高。如果发生这种情况,则不会引用MainActivity - >没有泄漏。

如果在HelperClass上调用onDestroy之前不会对MainActivity进行垃圾回收,则事件仍然没有泄漏,因为垃圾收集器足够智能以便能够清理循环引用。

发生泄密需要发生的事情是,一个超过Activity的对象将保留对它的引用或其上下文。

假设你的代码是这样的:

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

final HelperClass h = new HelperClass(this);

//does some work on a background thread, gets notified at some

//point in the future, through the callback, when the work

//has completed

longLivedComponent.doSomeBackgroundWork(new OnWorkFinishedListener(){

@Override

public void onWorkFinished(){

h.Addfiles(this, filename);

}

});

}

现在,让我们假设以下事件序列:

用户打开应用,MainActivity#1已创建,其onCreate被称为

调用

doSomeBackgroundWork,开始后台工作。当后台工作完成后,你的助手(引用MainActivity#1)将不得不做一些工作。

用户旋转设备,发生方向更改。

MainActivity由Android重新创建。 MainActivity#1已被销毁(即onDestroy将被调用),并且将创建新的MainActivity#2

MainActivity#2将发生第1,2步,即doSomeBackgroundWork#2将再次调用MainActivity。 (严格来说,这一步并不是真正相关,但仍然如此)

垃圾收集器运行。

MainActivity#1在步骤#2开始的后台工作完成。

醇>

通常,在步骤#6时,MainActivity#1占用的内存将被释放,因为MainActivity#1已被销毁。

但是,在此处描述的情况下,OnWorkFinishedListener需要longLivedComponent保留,直到后台工作完成。监听器既可以引用MainActivity#1(对其父类的隐式匿名内部类引用),也可以引用HelperClass实例,该实例还包含MainActivity#1的实例

当垃圾收集器在步骤#6看到此情况时,它会认为MainActivity#1仍处于活动状态&因为stil是指向它的对象。因此,它不会回收它的内存,你最终会在内存中出现MainActivity的两个实例并发生泄漏。

为了防止这种情况,你可以:在长期对象将使用的类中使用应用程序上下文而不是活动上下文。此外,在您的情况下,您不需要任何特定于活动本身的内容

确保任何长期存在的对象(在我们的例子中为longLivedComponent)或活动之间共享的对象在{{1}之后不会存储对Activity或其Context的引用已经被称为onDestroy()

希望这有帮助

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值