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 インスタンスのリーク
- この参照の意味がわかりません。ビューはアクティビティへの参照を保持しているため、GC が実行されませんか? いつ、どのように処理すればよいですか?
- 私は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);
}
}
私が知っていることは、私が活動を離れるときです:
- アクティビティは破棄され、アクティビティのインスタンスはもうありません。
- フラグメントが破壊されます。
- ビューは切り離されています。
では、なぜカナリア ライブラリはそれを主張するのでしょうか?リークされた参照があるのでしょうか?
ビューはいつ、どのようにコンテキストへの参照を失う必要がありますか?