我正在使用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 实例
- 我不知道这个参考是什么意思。该视图保留对阻止它被 GCed 的活动的引用?我应该何时以及如何处理它?
- 我使用了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);
}
}
我所知道的是,当我离开活动时:
- 该活动被销毁,并且不再有该活动的实例。
- 片段被销毁。
- 视图是分离的。
那么为什么金丝雀图书馆会声称 - 有一个泄露的参考资料?
视图应该何时以及如何失去对其上下文的引用?