2017-10-06 40 views
1

我的MainActivity具有Drawer並實例化新的Fragment,具體取決於點擊的MenuItem(基於this tutorial)。Android/Java:片段實例化會導致內存泄漏?

我監視的內存,這是略微上的每個片段變化而增加我擔心,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

檢查片段管理器中是否存在片段只需觀察一下'fragmentClass = CameraFragment.class'就可以寫成像'fragment = CameraFragment.newInstance()'。它有點乾淨,你可能不會再需要try catch塊了。 – petey

回答

1

實際上,該代碼沒有問題。物聯網可以優化爲:

  1. 返工Fragment#instantiate()方法(檢查docs)在類似Map
  2. 緩存情況下,爲了不創造新的每次經過抽屜導航

而且時間,您可以使用FragmentManager#findFragmentById()FragmentManager#findFragmentByTag()