Android fragment 内存泄漏

标签 android android-fragments memory memory-leaks out-of-memory

我的应用程序存在内存泄漏问题。 我在第一个女巫中用 2 个 fragment 测试它我创建了一个大变量(ArrayList arr = new ArrayList(10000000);)以查看内存在更改 fragment 时是否为空(第二个为空),但不幸的是,这并没有发生。

Activity 是一个 ActionBarActivity,当我更改 fragment 时,我会执行 remove(fragment) 和 popbackstack,但每次更改时内存都会增加。

请帮帮我!!!

我在下面发布了一些代码:Activity 是 ActionBarActivity,它有一个侧边菜单 NavigationDrawer:

public class MainActivity extends ActionBarActivity implements NavigationDrawerCallbacks {
   private Toolbar mToolbar;
   private NavigationDrawerFragment mNavigationDrawerFragment;
   private DrawerLayout mDrawerLayout;
   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
       mToolbar = (Toolbar) findViewById(R.id.toolbar_actionbar);
       mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer);
       setSupportActionBar(mToolbar);
       mNavigationDrawerFragment = (NavigationDrawerFragment) getFragmentManager().findFragmentById(R.id.fragment_drawer);
       mNavigationDrawerFragment.setup(R.id.fragment_drawer, (DrawerLayout) findViewById(R.id.drawer), mToolbar);
       setActionBarMenu(true);
       selectItem(1);
    }

    private void selectItem(int position) {
        final FragmentManager fm = getSupportFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();
        for (int i = 0; i < fm.getBackStackEntryCount(); ++i) {
           ft.remove(fm.findFragmentByTag(fm.getFragments().get(fm.getBackStackEntryCount() - 1).getTag()));
           fm.popBackStack();
        }
        switch (position) {
            case 0:
                break;
            case 1:
                onChangeFragment(new UsersCheckInFragment(), false);
            case 2:
            etc...
        }

        ft.commit();
    }

    @Override
    public void onNavigationDrawerItemSelected(int position) {
        selectItem(position);
    }

    public void onChangeFragment(Fragment fragment, boolean addToBackStack) {
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction().replace(R.id.container, fragment, ((Object) fragment).getClass().getSimpleName());
        if (addToBackStack)
            ft.addToBackStack("");
       ft.commit();
    }
}

和 fragment :

public class UsersFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        final View view = inflater.inflate(R.layout.fragment_users, container, false);
        mainActivity = (MainActivity) getActivity();
        ArrayList<Integer> arr = new ArrayList<Integer>(10000000);
        return view;
    }
}

这里是一些内存屏幕

first fragment

second fragment

again first fragment

最佳答案

这不是内存泄漏,垃圾收集器最终会被系统调用。不要求系统在您完成处理后立即从内存中删除 fragment 。

关于Android fragment 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30532426/

相关文章:

sql-server - 主要插入查询时查询完成但有错误

java - 是否必须将引用设置为 null 才能使垃圾收集工作

android - 为什么我的自定义 Actionbar 上的图像有不需要的左填充

android - 无法连接到 android 5.1 上的 native 本地套接字

android - map fragment 顶部的 float 操作按钮

Android:使用 Parcerable 将自定义对象的 ArrayList 从 fragment 发送到 Activity

java - Android Studio fragment

Android Button 始终保持在所有 Activity 之上以进行待机

java - 对 Firestore 文档进行排序

iphone - 我应该什么时候释放我的阵列?