android - 管理 fragment 事务时优化 Android 中的内存

标签 android android-fragments memory-management

我在我的应用程序中使用 fragment ,其中所有 fragment 都共享一个基本 Activity ,因此在应用程序关闭之前 Activity 不会被销毁。当我从一个 fragment 导航到另一个 fragment 时,我使用了以下代码:

 Fragment myFragment=new MyFragment();
 FragmentManager fragmentManager = getFragmentManager();
 fragmentManager.beginTransaction().addToBackStack("MyFragment")
 .replace(R.id.content_frame, myFragment,"AirtimeFragment").commit();

使用它时,我必须为每个 fragment 创建一个新的 Object,这不利于内存消耗。

所以我想创建一个管理所有 fragment 的全局方法,它检查 fragment 是否已经存在,然后不需要重新创建它只使用现有的 fragment 对象,所以我可以减少内存消耗?

最佳答案

FragmentTransaction 可以使用这个方法来管理

private void FragmentReplace(Class fragmentClass, Bundle bundle,Boolean isAddToBackStack) {
    try {

        Fragment fragment;
        Bundle bundle1Local;

        FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

        System.out.println("Class Name of Fragment is String ::= " + fragmentClass.getName());
        String fragmentTag=fragmentClass.getName();

        fragment=fragmentManager.findFragmentByTag(fragmentTag);

        if (fragment == null) {

            System.out.println("Fragment is null, generating new "+fragmentTag+" fragment ");

            /**
             * Creating Fragment Object But Please Remember Fragment Must Have Empty Constrctor and it is Public
             */

            Constructor constructor = fragmentClass.getConstructor();
            Object instanceFragment = constructor.newInstance();

            fragment=(Fragment) instanceFragment;
            if(bundle != null) {
                fragment.setArguments(bundle);
            }
            if(isAddToBackStack)
                fragmentTransaction.addToBackStack(fragmentTag);

            fragmentTransaction.replace(R.id.content_frame, fragment, fragmentTag);
            fragmentTransaction.commit();

        } else if (fragment.isAdded()) {

            System.out.println("Fragment is added  " + fragmentTag + " fragment ");

            bundle1Local=fragment.getArguments();
            if(bundle1Local != null)
                fragment.getArguments().clear();

            if(bundle != null) {
                 fragment.getArguments().putAll(bundle);
            }
            if(isAddToBackStack)
                fragmentTransaction.addToBackStack(fragmentTag);

            fragmentTransaction.show(fragment);

        } else {

            System.out.println("Fragment is not added but still there  " + fragmentTag + " fragment ");

            fragmentTransaction.detach(fragment);
            System.out.println("Fragment is detached  " + fragmentTag + " fragment ");

            System.out.println("Fragment is null, generating new  " + fragmentTag + " fragment ");
            Constructor constructor = fragmentClass.getConstructor();
            Object instanceFragment = constructor.newInstance();

            fragment=(Fragment) instanceFragment;
            if(bundle != null) {
                fragment.setArguments(bundle);
            }
            if(isAddToBackStack)
                fragmentTransaction.addToBackStack(fragmentTag);

            fragmentTransaction.replace(R.id.content_frame, fragment, fragmentTag);
            fragmentTransaction.commit();

        }

    } catch (Exception ex) {

        System.out.println("Error::" + ex.toString());

    }

}

关于android - 管理 fragment 事务时优化 Android 中的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31806873/

相关文章:

android - 如何在单击后立即禁用按钮

android - 加密文本出现错误

java - 无法解析抽屉导航中 fragment 中的 getSystemService

android - 官方 Android 滑动/选项卡示例包括已弃用的功能 : Is there an alternative sample?

iphone - 关于添加到数组的对象中对象的保留计数问题,Obj-C

python - 在 IPython 中释放巨大的 numpy 数组的内存

android - 在 ListView 上实现无限滚动

Android:从代码中使用 dimen.xml

android - Google Map APIv2 实现,二进制 XML 文件行 #6 : Error inflating class fragment

c++ - 为什么堆栈内存大小如此有限?