为什么我的android应用程序占用了太多内存?

为什么我的android应用程序占用了太多内存?,android,android-fragments,android-recyclerview,android-glide,Android,Android Fragments,Android Recyclerview,Android Glide,情况是这样的: 我有一个活动,它有一个工具栏、一个Tablayout和一个viewpager(将包含5个片段) 在第一个片段中,我有一个布局将包含一个默认片段,该片段将有一个带有两列的回收器视图。此页面上的每个元素都有一个从Internet下载的图像(使用Glide并保存在缓存中),当用户单击支架(列表中的一个元素)时,会将“布局容器”上的此默认片段更改为另一个片段,该片段将具有一个新的回收器视图,其中包含使用Glide从Internet下载的图像。类似于Instagram搜索页面 我认为Gli

情况是这样的: 我有一个活动,它有一个工具栏、一个Tablayout和一个viewpager(将包含5个片段)

在第一个片段中,我有一个布局将包含一个默认片段,该片段将有一个带有两列的回收器视图。此页面上的每个元素都有一个从Internet下载的图像(使用Glide并保存在缓存中),当用户单击支架(列表中的一个元素)时,会将“布局容器”上的此默认片段更改为另一个片段,该片段将具有一个新的回收器视图,其中包含使用Glide从Internet下载的图像。类似于Instagram搜索页面

我认为Glide是个问题,但我把所有的代码都写出来了,当我在emulator上运行这个应用程序时,它会消耗89MB的内存

额外信息

  • 任何片段中的RView上的每个元素都是通过使用Volley下载JSONArray创建的,我将请求放在MySingleton队列中,并将上下文定义为getContext()(当代码来自片段时,我应该使用getActivity().ApplicationContext()而不是getContext())
(位于活动内的查看寻呼机内的片段内)

然后它下载图片URL并使用Glide在视图上收费

if(holder.publication.getPicture() != null ){
        Glide.with(holder.ctx).load(holder.publication.getPicture()).diskCacheStrategy(DiskCacheStrategy.ALL).centerCrop().into(holder.picture_imgView);
    }
  • 我没有使用静态变量

  • 此外,我从回收器视图元素中删除了所有动画,但仍然很慢

  • 我使用Android监视器和“跳转Java堆”选项来查看它是如何管理内存的,主要数字在字节[]上(我不理解如何使用这个工具)

非常感谢

更新 在我的日志中,我总是得到以下信息:

W/ViewRootImpl: Dropping event due to no window focus: KeyEvent { action=ACTION_DOWN, keyCode=KEYCODE_BACK, scanCode=0, metaState=0, flags=0xc8, repeatCount=1, eventTime=18009881, downTime=18009352, deviceId=-1, source=0x101 }

I/Choreographer: Skipped 98 frames!  The application may be doing too much work on its main thread.

嗯,我想我找到了解决办法,我得出了以下结论:

  • 使用.jpg格式的drawables或任何大于150kb的文件将使用内存。在我的例子中,我使用非常大的图像作为背景,在回收器视图中使用较小的图像,但大小超过200kb。那些人正在杀死拉姆
  • 在调用截取请求时,最好使用片段的本地上下文(getContext()),并将其放入MySingleton队列
  • recyclerViews上的持有者应该是静态内部类,因为您将重用它们,这是节省内存的好方法
  • 如果您在每个支架上使用Glide下载图像,并且有一些链接是空的,那么您应该清理ImageView:
    Glide.clear(ImgView)
  • 创建用于调用SharedReference的对象不是一个好主意。最好使用一个全局类,该类使用一个上下文(包含所有片段的活动的上下文)并从那里调用SharedReferences。类似于:
    MyCallerClass.getInstance().GetPrefsDataFouser()

所有这些都是我这些天得到的结论。。。现在,我的应用程序使用glide下载图像时使用50mb内存,实时搜索时最大使用80mb或90mb内存…

我感觉RAM的使用是完全正常的,因为你也在下载图像。有时该值会上升到120或130 mb,但我想我最终解决了这个问题。问题似乎出在抽屉上,它们太大了。我将继续分析,给出最终的解决方案。我有类似的问题,除了我不使用任何大图像作为背景。我想你的解决方案最大的部分是使用更小的图像,其他建议有多大帮助?你好,@Tony!是的,主要的问题是我使用的大图像资源作为背景,我必须对我的答案做一些快速修复。关于上下文的使用,这与它们可能产生的引用和泄漏有关。您不能使用活动或片段(或任何其他Android组件)上下文作为singleton的引用,因为singleton将在应用程序中长期存在,并且活动将以某种方式消亡,对活动的引用将导致内存泄漏。这篇文章更详细:
W/ViewRootImpl: Dropping event due to no window focus: KeyEvent { action=ACTION_DOWN, keyCode=KEYCODE_BACK, scanCode=0, metaState=0, flags=0xc8, repeatCount=1, eventTime=18009881, downTime=18009352, deviceId=-1, source=0x101 }

I/Choreographer: Skipped 98 frames!  The application may be doing too much work on its main thread.