如何避免使用setRetainInstance(true)泄漏第一个Activity的SupportMapFragment

时间:2017-07-12 19:32:48

标签: android google-maps android-fragments memory-leaks

我正在开发使用GoogleMaps的应用。我使用了面向片段的导航模式 - 其中一个主要的Activity包含片段,就像页面屏幕一样。对于更简单的状态处理,这些片段被设置为自己保留它们的实例(即setRetainInstance为true,链接到视图的所有字段都设置为null onDestroyView of fragment)。其中一个片段本身就包含GoogleMap。为了在屏幕旋转方面获得更好的性能,我使用setRetainInstance(true)作为SupportMapFragment。但每次创建SupportMapFragment的第一个Activity都会泄露。如果我删除setRetainInstance(true) - 没有内存泄漏。

MainActivity中onCreate的代码:

@Override 
protected void onCreate (Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mFragmentManager = getSupportFragmentManager();
    //if activity created from scratch
    if (savedInstanceState == null) {
        MyMapFragment fragment = mFragmentManager.findFragmentByTag(fragmentTag);
        if (fragment == null) {
            fragment = MyMapFragment.newInstance();
        }
        if (fragment != null) {
            fragment.setRetainInstance(true);
            mFragmentManager
                    .beginTransaction()
                    .replace(R.id.fragment_container, fragment, fragmentTag)
                    .addToBackStack(fragmentTag)
                    .commit();
        }
    }
    ...
}

MyMapFragment&#39>中的代码

@Override
public void onStart() {
    super.onStart();
    FragmentManager fragmentManager = getChildFragmentManager();
    SupportMapFragment mapFragment = (SupportMapFragment) fragmentManager.findFragmentByTag(MAP_FRAGMENT_TAG);
    if (mapFragment == null) {
        mapFragment = SupportMapFragment.newInstance();
        mapFragment.setRetainInstance(true);
        fragmentManager.beginTransaction().replace(R.id.map_container, mapFragment, MAP_FRAGMENT_TAG).commit();
    }
    mapFragment.getMapAsync(this);
    ...
}

此处有内存泄漏的屏幕截图:

Leak Canary

hprof

每次重新创建Activity时,是否有办法避免此内存泄漏而不初始化MapFragment?

0 个答案:

没有答案