Android / Java:片段实例化导致内存泄漏?

时间:2017-10-06 19:33:11

标签: java android android-fragments memory-leaks

我的MainActivityDrawer并实例化新的Fragment,具体取决于点击的MenuItem(基于this tutorial)。

我监控内存,每次更改片段时略微增加,我担心,fragmentClass.newInstance()不正确。

// MainActivity
public boolean onNavigationItemSelected(MenuItem item) {

    int id = item.getItemId();
    Fragment fragment = null;
    Class fragmentClass = null;
    if (id == R.id.nav_camera) {
        fragmentClass = CameraFragment.class;
    } else if (id == R.id.nav_gallery) {
        fragmentClass = GalleryFragment.class;
    } else if (id == R.id.nav_slideshow) {
        fragmentClass = SlideshowFragment.class;
    } else if (id == R.id.nav_manage) {
        fragmentClass = ManageFragment.class;
    } else if (id == R.id.nav_share) {
        fragmentClass = ShareFragment.class;
    } else if (id == R.id.nav_send) {
        fragmentClass = SendFragment.class;
    }

    try {
        fragment = (Fragment) fragmentClass.newInstance();
    } catch (Exception e) {
        e.printStackTrace();
    }

    FragmentManager fragmentManager = getSupportFragmentManager();
    fragmentManager.beginTransaction().replace(R.id.layout_main, fragment).commit();
}

我希望有类似的东西:

// Pseudocode
if (fragmentManager.instanceExists(fragmentClass)) {
    // load instantiated fragment
} else {
    // newInstance()
}

我怎样才能避免内存泄漏或这是否相关?

谢谢!

1 个答案:

答案 0 :(得分:1)

实际上,该代码没有问题。你可以优化的事情是:

  1. 重做Fragment#instantiate()方法(检查docs
  2. Map之类的方式缓存实例,以便每次浏览抽屉时都不创建新实例
  3. 此外,您可以使用FragmentManager#findFragmentById()FragmentManager#findFragmentByTag()

    检查FragmentManager中是否存在片段