【问题标题】:Fragment backstack uses too much memory分片回栈占用过多内存
【发布时间】:2016-03-29 14:07:03
【问题描述】:

我正在开发一个相当大的应用程序(大约 70 个片段)。当我点击我的应用程序时,我以前的所有片段都存储在后台堆栈中。几次点击后,我的内存非常高,在旧手机(三星 S3)上,我得到了 OutOfMemory 异常。

有没有办法对片段回栈的内存使用做些什么? 我已经尝试制作自己的 backstack,它解决了内存问题,但唯一的问题是它不记得搜索词和滚动位置:

Stack<BackStackEntry> mBackStack = new Stack<>();
mBackStack.add(new BackStackEntry(tag, fragment.getClass()));

【问题讨论】:

    标签: android android-fragments android-memory fragment-backstack


    【解决方案1】:

    您可以对片段使用 SingleTone 模式。至少肯定会减少内存,因为您不必每次调用 at 或将其添加到后堆栈时都重新创建片段

     // Singleton implementation
        private static YourFragment instance;
    
        public YourFragment () {
        }
    
        /**
         * Static method which return the instance of the fragment. If the fragment is null, load it,
         * else create new fragment. Singleton pattern.
         *
         * @param context
         * @return
         */
        public static YourFragment getInstance() {
            if (instance == null) {
                instance = new YourFragment ();
            }
    
            return instance;
        }
    

    您可以使用这行代码访问您的片段:

    SearchFragment.getInstance()
    

    【讨论】:

    • 但这是否也保存了滚动位置等?
    • 我认为您的滚动没有问题。
    【解决方案2】:

    在非常特殊的情况下,您可以通过以下方式请求更大的堆大小 在清单中将 largeHeap 属性设置为“true” 标签。永远不要仅仅因为你已经请求一个大堆 内存不足,您需要快速修复——您应该仅在以下情况下使用它 你确切地知道你所有的内存被分配在哪里以及为什么它 必须保留。

    阅读https://developer.android.com/training/articles/memory.html

    【讨论】:

    • 我想防止这种情况发生
    • @BartBergmans 很好!)你看过这个链接吗,也许它可以帮助你stackoverflow.com/questions/28483600/…
    • 实际上 android:largeHeap 是增加分配给应用程序内存的工具。没有明确定义需要使用此标志。如果您需要更多内存 - Android 为您提供了增加内存的工具。但是使用的必要性,你自己定义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-26
    • 2011-01-19
    • 2019-06-04
    • 2017-05-14
    • 1970-01-01
    相关资源
    最近更新 更多