2

我正在使用LeakCanary库来解决我的活动的内存泄漏问题。修复了几个问题后,我得到了这个 logcat 输出:

  • com.MyPackage.activities.MyActivity 已泄露:
  • GC ROOT com.MyPackage.MyView.mAttachInfo
  • 引用 android.view.View$AttachInfo.mRootCallbacks
  • 引用 android.view.ViewRootImpl.mContext
  • 泄漏 com.MyPackage.activities.MyActivity 实例
  1. 我不知道这个参考是什么意思。该视图保留对阻止它被 GCed 的活动的引用?我应该何时以及如何处理它?
  2. 我使用了Eclipse 内存分析工具,发现实际上没有我的活动实例。那有意义吗?

也将此作为金丝雀的问题打开。


编辑1:相关实施:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

     MyView.InteractionCallbacks interactionCallback = new InteractionCallbackImplementation(
     mNewView = new MyView(getActivity().getApplicationContext(), 
     LayoutInflater li = (LayoutInflater) getActivity().getApplicationContext().getSystemService(
                                                                                          Service.LAYOUT_INFLATER_SERVICE);
     ViewGroup fragmentLayout = (ViewGroup) li.inflate(R.layout.fragment_layout, container, false);
     fragmentLayout.addView(mNewView, 0);
}

public static class InteractionCallbackImplementation implements MyView.InteractionCallbacks {

        WeakReference<MyFragment> frag;
        public InteractionCallbackImplementation(MyFragment myFragment){
            frag = new WeakReference<myFragment>(myFragment);
        }

        @Override
        public void partsSelected(long[] parts) {
               // ...
        }
}

视图:是处理 gl 渲染的外部 jar 的一部分。有对片段的引用。

public class MyView extends GLSurfaceView implements Renderer {
     private void runOnUiThread(Runnable runnable) {
          this.getHandler().post(runnable);
     }
}

我所知道的是,当我离开活动时:

  1. 该活动被销毁,并且不再有该活动的实例。
  2. 片段被销毁。
  3. 视图是分离的。

那么为什么金丝雀图书馆会声称 - 有一个泄露的参考资料?

视图应该何时以及如何失去对其上下文的引用?

4

0 回答 0