我正在使用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 instance
同时将此作为金丝雀的issue打开。
编辑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);
}
}
我所知道的是,当我离开活动时:
那么为什么金丝雀图书馆声称 - 有一个泄露的参考?
视图何时以及如何失去它对上下文的引用?