【问题标题】:Fragment garbage collection issue碎片垃圾回收问题
【发布时间】:2011-07-26 19:27:24
【问题描述】:

我正在编写一个使用片段的应用程序,并且在我的 DDMS 堆转储中看到一个非常令人困惑的行为:当我最初运行我的应用程序时,假设堆栈中有几个片段:

HomeFragment: 1
WelcomeFragment: 1
SignInFragment: 1
CreateAcctFragment: 1

其中每一个的直接支配者是。

然后我旋转屏幕。我现在得到:

HomeFragment: 2
WelcomeFragment: 2
SignInFragment: 2
CreateAcctFragment: 2

现在每个实例的直接支配者是一个,android.support.v4.app.FragmentManagerImpl 是另一个。

我最初认为我有内存泄漏,我的一个片段没有被垃圾收集,就像以前发生在我身上的那样。但是,在这种情况下,每次我旋转屏幕时,我都会为每个屏幕添加一个实例。现在,无论我旋转屏幕多少次,我都“只”看到了 2 个实例。

有什么想法/建议吗?

【问题讨论】:

    标签: android android-fragments


    【解决方案1】:

    如果您的活动 onCreate() 方法未通过捆绑包传递,您应该只实例化片段。如果一个bundle被传递给onCreate(),android框架会为你实例化它们。

    这是片段文档中的 Activity.onCreate 示例: http://developer.android.com/guide/topics/fundamentals/fragments.html

    public static class DetailsActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            if (getResources().getConfiguration().orientation
                    == Configuration.ORIENTATION_LANDSCAPE) {
                // If the screen is now in landscape mode, we can show the
                // dialog in-line with the list so we don't need this activity.
                finish();
                return;
            }
    
            if (savedInstanceState == null) {
                // During initial setup, plug in the details fragment.
                DetailsFragment details = new DetailsFragment();
                details.setArguments(getIntent().getExtras());
                getFragmentManager().beginTransaction().add(android.R.id.content, details).commit();
            }
        }
    }
    

    【讨论】:

    • 是的,如果 savedInstanceState 为空,我不会实例化片段;那不是问题。不过谢谢!
    • 凯瑟琳:如果您有答案,请发布并接受! xkcd.com/979
    猜你喜欢
    • 2014-02-23
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    相关资源
    最近更新 更多