Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 删除片段后内存未释放_Android_Android Fragments_Android Glide_Android Memory - Fatal编程技术网

Android 删除片段后内存未释放

Android 删除片段后内存未释放,android,android-fragments,android-glide,android-memory,Android,Android Fragments,Android Glide,Android Memory,我有一个片段,它有一个回收视图 在这个RecyclerView中,我偶尔会下载并显示图像(加载到ImageView) 因此,当我打开片段时,使用的内存有时可能会从30MB左右跳到100MB左右甚至更多 保存片段的活动完成后,内存不会释放。它与以前一样 我查看了文档,显然我们不必担心在RecyclerView中释放位图。这是一个很大的问题,因为应用程序经常因为OOM而崩溃 当片段被删除时,我应该如何正确处理释放内存的问题 编辑:另一个观察结果 我注意到的另一件事是,如果我完成活动,然后再次启动相同

我有一个
片段
,它有一个
回收视图

在这个
RecyclerView
中,我偶尔会下载并显示图像(加载到
ImageView

因此,当我打开
片段时,使用的内存有时可能会从30MB左右跳到100MB左右甚至更多

保存
片段的
活动
完成后,内存不会释放。它与以前一样

我查看了文档,显然我们不必担心在
RecyclerView
中释放
位图。这是一个很大的问题,因为应用程序经常因为OOM而崩溃

片段
被删除时,我应该如何正确处理释放内存的问题

编辑:另一个观察结果


我注意到的另一件事是,如果我完成
活动
,然后再次启动相同的
活动
。内存会下降一段时间,然后恢复到100MB,这让我相信在再次启动
片段之前,内存已被清除。

垃圾收集有时是一个痛苦的问题在Android中。 大多数开发者没有考虑这个问题,只是在没有任何资源分配的情况下继续开发。 这当然会导致内存问题,如泄漏、OOM和不必要的资源绑定。绝对没有自动释放内存的方法。在任何情况下,您都不能完全依赖垃圾收集器

无论何时传递片段或活动的onDestroy()方法,都可以而且应该删除应用程序中不再需要的构造。可以执行以下操作:

  • 避免匿名侦听器实例。创建侦听器并在不再需要时销毁它们
  • 将所有侦听器(可能是click、longclick等)设置为null
  • 清除所有变量、数组。对活动/片段中包含的所有类和子类应用相同的过程
  • 每当您对给定类执行前面的任何步骤时,将变量设置为null(适用于所有变量)
  • 我最终做的是创建一个像

    public interface clearMemory(){
        void clearMemory();
    }
    
    并在每个类上实现它,无论是活动、片段还是普通类(包括适配器、自定义视图等)

    然后,每当类被销毁时,我就会调用该方法(因为应用程序正在被销毁,或者每当我觉得有必要这样做时,小心不要在正常运行时进行处理)


    通过以系统的方式实现这一点,我的应用程序的内存管理变得更简单、更精简。这样,人们就可以准确地知道/控制内存的分配方式和时间。

    这是对Ricardo答案的补充

    您可以添加以下代码来启动Android中的垃圾收集:
    Runtime.getRuntime().gc();

    注意:在将所有局部变量设置为null后调用此函数。执行此代码并不保证系统会在应用程序上进行垃圾收集,它只是暗示可能是执行此操作的好时机。
    我在所有的活动“
    onDestroy()
    ”中都使用了它,它似乎总是在我想要的时候起作用。

    试一试,它可能会帮助您。

    没错。基本上可以调用System.gc()来“提示”系统,它最终将执行收集所有对象而不引用。受控内存管理始终是任何应用程序的重要组成部分!这个答案对我很有帮助。我一直在尝试清除destroy上的资源,但启动垃圾收集后只会减少内存。谢谢。如果我调用garba,会发生什么每次popbackstack后都会使用ge collector?谢谢,这肯定会有帮助。我明天会尝试一下(尽管在整个应用程序中使用此功能可能需要一段时间)我会让你知道它是怎么回事。当你说要清除所有变量时,这意味着实例变量,对吗?如果我在onCreate方法中创建了一个变量,我是否应该在停止使用它后清除它?是的。一旦你知道你不再需要它,就必须/应该处理你分配的所有东西。作为一个比喻:1)你买了一张一次性纸。你在那张纸上写下一些关于你一天的事实2)你将使用那张纸一整天,但你知道你不会永远需要这张纸3)到一天结束时,你意识到这张纸已经达到了它的目的。4) 你把纸撕成碎片扔进垃圾桶扔掉。现在,将“一张纸”理解为您使用的任何变量,将“一天”理解为您的活动生命周期。看起来我有很多代码重构要做:)谢谢!还有一个问题。您认为在片段中处理变量的最佳位置是什么?我理解onDestroy和onDestroyView可能并不总是被称为。所以现在,我在上面做。可以吗?好极了。看看另一个StackOverflow帖子:问候!
    @Override
    public void onDestroy(){
        clearMemory();
    }
    
    public void clearMemory(){
        normalButtonOnClickListener = null;
        normalButton.setOnClickListener(null);
        normalButton = null;
        myCustomClass.clearMemory(); // apply the interface to the class and clear it inside
        myCustomClass = null;
        simpleVariable = null;
        ...        
    }