在没有onDestroy的情况下替换片段

时间:2012-04-03 15:36:34

标签: android memory-leaks fragment

在我的Android应用程序中,我有片段,其中一个非常重(它从网上加载很多东西),而另一个很轻(如设置面板)。

我用这样的东西在片段之间切换:

private Fragment myFragment1;
private Fragment myFragment2;
......
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.main_fragment, myFragment2);
ft.commit();

我的问题是,当它被替换时,它会进入片段的onStop()和onDestroy()。 因为我没有释放onDestroy()中的重物,所以我的内存泄漏很大......

我想将所有片段保留在内存中,并且只在屏幕上显示/隐藏它们。 这样可以在屏幕上快速切换,而不必每次都加载所有内容。

所以,问题是: 如何更改代码以将所有碎片保留在内存中? 我想像儿子一样:

Fragment1.onPause();
Fragment2.onResume();

而不是:

Fragment1.onPause();
Fragment1.onStop();
Fragment1.onDestroy();
Fragment2.onCreate();
Fragment2.onResume();

还有一件事,我在android 2.2及更多版本上使用android.support.v4.app.Fragment。

非常感谢!

编辑1:

我找到了一些帮助,我做了这个功能:

private void changeFragement(Fragment f, String fragmentTag) {
    try {
        if (f != null && fragmentTag != null) {

            fm = getSupportFragmentManager();
            ft = fm.beginTransaction();
            Fragment currentFragment = fm.findFragmentById(R.id.main_fragment);
            if (currentFragment != null)
                ft.hide(currentFragment);

            Fragment cachedFragment = fm.findFragmentByTag(fragmentTag);
            if (cachedFragment == null)
                ft.add(R.id.main_fragment, f, fragmentTag);
            else
                ft.show(f);              

            /*Fragment cachedFragment = fm.findFragmentByTag(fragmentTag);
            if (cachedFragment == null)
                cachedFragment = f;
            ft.replace(R.id.main_fragment, cachedFragment, fragmentTag);*/

            ft.addToBackStack(null);
            ft.commit();

        }
    } catch (IllegalStateException err) {
    }
}

问题是片段没有很好地替换,我不明白“ft.addToBackStack(null);”... 你能帮我纠正一下这段代码吗?

1 个答案:

答案 0 :(得分:1)

你做不到。 Android处理活动,服务等的生命周期......包括Fragments。 你需要重新考虑你这样做。

我知道文档中有“背景”片段。也许你可以在那个中加载并与你显示/隐藏的其他片段共享一些状态?