2016-09-19 8 views
3

我坚持内存泄漏在我的主要活动(NavigationActivity)机器人 - 例如设置为null中的onDestroy活动继续泄漏甚至()方法

public static NavigationActivity navigationActivity; 

public static NavigationActivity getNavigationActivity() { 
    return navigationActivity; 
} 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_navigation); 

    navigationActivity = NavigationActivity.this; 

} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    if (navigationActivity != null) { 
     navigationActivity = null;  
    }  
} 

它在哪里泄漏?我该如何解决它?任何帮助,将不胜感激。非常感谢你。

我使用泄漏金丝雀,这是泄漏 enter image description here

+0

我抬头看了你的个人资料,发现你根本不接受答案。你应该为未来的读者做,因此他们知道哪个答案是正确的。 Downvoting出于这个原因 –

+0

你可以在leakCanary截图中打开NavigationActivity(+)stacktree。这是什么navigationActivity类? – sytolk

回答

1

尝试使用

@Override 
protected void onStop() { 
    super.onStop(); 
    navigationActivity = null; 
} 

但使用活动的静态参考是非常不好的做法,不这样做。

在大多数情况下,您可以使用activity.this引用或类似getActivity()方法。

1

使实例成为WeakReference

private final WeakReference<Activity> navigationActivity; 

另外onDestroy()不保证被调用。阅读更多关于onDestroy()here

1

您应该在onStop method中将活动实例设置为null,因为可能不会调用onDestroy

从Android开发documentation

保护无效的onDestroy()

在API级别1之前的活性是 破坏执行任何最后的清理。这可能是因为活动正在完成 (有人称为完成()就可以了,或者因为系统暂时为 破坏了这个活动的实例以节省空间。你可以用 区分这两个方案与isFinishing() )方法

注:不依靠此方法被称为作为一个地方保存 数据。例如,如果一个活动是在内容 提供商编辑数据,这些修改应该在任何的onPause承诺! ()或 onSaveInstanceState(Bundle),不在这里。这个方法通常实现为 像线程这样的免费资源与 活动相关联,这样一个被销毁的活动就不会离开 ,而其他应用程序仍在运行。有 情况下系统将简单地杀死活动的主机 进程而不调用此方法(或任何其他人),因此它不应该用于在过程消失后将其保留在 左右。

+1

相反,我会说清理对象类似于释放资源,它是一个清理我们不再需要的对象的好地方。 – Dharmendra

1

您清除了活动中的引用。但ContactsCompletionView班仍然有很强的参考您的活动。避免此泄漏的最佳方法不是公开您的活动链接。
但是,如果你真的需要这个,你可以使用WeakReference到你的Activity。所以你的方法getNavigationActivity()可能看起来像这样:

public static WeakReference<NavigationActivity> navigationActivityRef; 
{ 
    public static WeakReference<NavigationActivity> getNavigationActivity() { 
     if(navigationActivityRef == null) { 
      navigationActivityRef = new WeakReference<>(this); 
     } 
     return navigationActivityRef; 
}