3

我的主要活动(NavigationActivity)中存在内存泄漏

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;       
    }      
}

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

我正在使用泄漏金丝雀,这就是泄漏 在此处输入图像描述

4

4 回答 4

1

尝试使用

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

但是使用 Activity 的静态引用是非常糟糕的做法,不要这样做。

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

于 2016-09-19T06:53:11.067 回答
1

使实例成为WeakReference.

private final WeakReference<Activity> navigationActivity;

也不onDestroy()保证被调用。在此处阅读有关 onDestroy() 的更多信息。

于 2016-09-19T06:53:22.860 回答
1

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

来自 Android 开发者文档

受保护的无效 onDestroy ()

在 API 级别 1 中添加 在销毁活动之前执行任何最终清理。这可能是因为 Activity 正在完成(有人在其上调用了 finish(),或者因为系统正在临时销毁该 Activity 实例以节省空间。您可以使用 isFinishing() 方法区分这两种情况。

注意:不要指望这个方法被称为保存数据的地方!例如,如果一个活动正在内容提供者中编辑数据,那么这些编辑应该在 onPause() 或 onSaveInstanceState(Bundle) 中提交,而不是在这里。此方法通常用于释放资源,例如与活动相关联的线程,以便被破坏的活动不会在其应用程序的其余部分仍在运行时留下这些东西。在某些情况下,系统会简单地终止 Activity 的宿主进程,而不会在其中调用此方法(或任何其他方法),因此不应使用它来执行打算在进程消失后保留的事情。

于 2016-09-19T06:54:38.810 回答
1

您清除了活动中的引用。但是课程ContactsCompletionView仍然对您的活动有很强的参考意义。避免这种泄漏的最佳方法是不要公开指向您的活动的链接。
但如果你真的需要这个,你可以使用WeakReference你的Activity. 因此,您的方法getNavigationActivity()可能如下所示:

public static WeakReference<NavigationActivity> navigationActivityRef;
{
    public static WeakReference<NavigationActivity> getNavigationActivity() {
      if(navigationActivityRef == null) {
          navigationActivityRef = new WeakReference<>(this);
      }
      return navigationActivityRef;
}     
于 2017-11-13T08:11:25.467 回答