为什么我的android应用程序占用了太多内存?
情况是这样的: 我有一个活动,它有一个工具栏、一个Tablayout和一个viewpager(将包含5个片段) 在第一个片段中,我有一个布局将包含一个默认片段,该片段将有一个带有两列的回收器视图。此页面上的每个元素都有一个从Internet下载的图像(使用Glide并保存在缓存中),当用户单击支架(列表中的一个元素)时,会将“布局容器”上的此默认片段更改为另一个片段,该片段将具有一个新的回收器视图,其中包含使用Glide从Internet下载的图像。类似于Instagram搜索页面 我认为Glide是个问题,但我把所有的代码都写出来了,当我在emulator上运行这个应用程序时,它会消耗89MB的内存 额外信息为什么我的android应用程序占用了太多内存?,android,android-fragments,android-recyclerview,android-glide,Android,Android Fragments,Android Recyclerview,Android Glide,情况是这样的: 我有一个活动,它有一个工具栏、一个Tablayout和一个viewpager(将包含5个片段) 在第一个片段中,我有一个布局将包含一个默认片段,该片段将有一个带有两列的回收器视图。此页面上的每个元素都有一个从Internet下载的图像(使用Glide并保存在缓存中),当用户单击支架(列表中的一个元素)时,会将“布局容器”上的此默认片段更改为另一个片段,该片段将具有一个新的回收器视图,其中包含使用Glide从Internet下载的图像。类似于Instagram搜索页面 我认为Gli
- 任何片段中的RView上的每个元素都是通过使用Volley下载JSONArray创建的,我将请求放在MySingleton队列中,并将上下文定义为getContext()(当代码来自片段时,我应该使用getActivity().ApplicationContext()而不是getContext())
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.