【问题标题】:Android/Java: Fragment instantiating causes memory leak?Android/Java:片段实例化导致内存泄漏?
【发布时间】:2017-10-06 19:33:11
【问题描述】:

我的MainActivity 有一个Drawer 并实例化一个新的Fragment,具体取决于点击的MenuItem(基于this tutorial)。

我监控了 内存,它在每次 Fragment 更改时略微增加,我担心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()
}

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

谢谢!

【问题讨论】:

  • 只是观察,fragmentClass = CameraFragment.class 可以写成fragment = CameraFragment.newInstance()。它有点干净,你可能不再需要 try catch 块了。

标签: java android android-fragments memory-leaks


【解决方案1】:

实际上,该代码没有问题。您可以优化的内容有:

  1. 返工Fragment#instantiate()方法(检查docs)
  2. 在 Map 之类的东西中缓存实例,以免每次浏览抽屉时都创建新实例

另外,您可以使用 FragmentManager#findFragmentById() 或 FragmentManager#findFragmentByTag() 检查 FragmentManager 中是否存在片段

【讨论】:

    猜你喜欢
    • 2013-11-30
    • 1970-01-01
    • 2011-09-03
    • 2020-10-24
    • 1970-01-01
    • 2014-02-19
    • 1970-01-01
    • 2019-12-22
    • 2017-01-06
    相关资源
    最近更新 更多