情况是这样的: 我有一个 Activity,它有一个工具栏、一个 Tablayout 和一个 View Pager(将包含 5 个 fragment )
在第一个 fragment 中,我有一个布局,将包含一个默认 fragment ,该 fragment 将有一个包含两列的 Recycler View 。这上面的每个元素都有一个从互联网下载的图像(使用 Glide 并保存在缓存中),当用户点击持有者(列表的一个元素)时,会将“布局容器”上的这个默认 fragment 更改为另一个将有一个新的 Recycler View,其中包含使用 Glide 从 Internet 下载的图像。类似于 Instagram 搜索页面。
我认为 Glide 是问题所在,但我注释了所有代码,当我在模拟器上运行该应用程序时,它消耗了 89 MB 的 RAM 或多或少。
额外信息
- 任何 fragment 中 RView 上的每个元素都是通过使用 Volley 下载 JSONArray 创建的,我将请求放入 MySingleton 队列并将上下文定义为 getContext()(我应该使用 getActivity().ApplicationContext() 而不是 getContext( ) 当代码来自 fragment 时? )
(在 Activity 内的 View 寻呼机内的 fragment 内)
MySingleton.getInstance(getContext()).addToRequestQueue(req);
然后它下载图片 URL 并使用 Glide 在 View 上收费。
if(holder.publication.getPicture() != null ){
Glide.with(holder.ctx).load(holder.publication.getPicture()).diskCacheStrategy(DiskCacheStrategy.ALL).centerCrop().into(holder.picture_imgView);
}
我没有使用静态变量
此外,我从 Recycler View 元素中删除了所有动画,但速度仍然很慢。
我使用 Android 监视器和“Jump Java Heap”选项来查看它是如何管理内存的,主要编号在 Byte[] 上(我不明白如何使用这个工具)
非常感谢!
更新 在我的日志中,我总是得到这个:
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 格式的可绘制对象或任何大于 150kb 的文件都会占用内存。就我而言,我使用非常大的图像作为背景,在回收站 View 中使用小图像但大于 200kb。那些正在杀死拉姆。
- 最好在调用 Volley Request 时使用 fragment 的本地上下文 (getContext()) 并将其放入 MySingleton 队列。
- recyclerViews 上的 Holder 应该是静态内部类,因为您要重复使用它们,这是节省内存的好方法。
- 如果您在每个 Holder 上使用 Glide 下载图片并且有一些链接是空的,您应该清理 ImageView:
Glide.clear(ImgView);
- 为调用 SharedPreferences 创建对象不是一个好主意。最好使用一个全局类,它使用一个上下文(包含所有 fragment 的 Activity )并从那里调用 SharedPreferences。类似于:
MyCallerClass.getInstance().getPrefsDataOfOuser();
所有这些都是我这些天得出的结论...现在我的应用程序使用 50mb 的内存下载带有 Glide 的图像和 80mb 或 90mb 的最大内存用于实时搜索...
关于android - 为什么我的 Android 应用程序占用过多内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37801392/