android - 相同的 ImageButtons 消耗大量内存

我最近才开始开发 Android 应用程序并面临内存问题。使用 Android Studio 的分配跟踪功能,我发现在多个 Activity 上显示的四个 ImageButtons 最有可能导致问题。分配跟踪结果显示几乎所有内存都被两种关于图像的方法使用。看: Allocation Tracking result

按钮的可绘制对象是大小约为 20 KB 的小图标,位于 drawable-nodpi 中。这样 Android 就不必对它们进行缩放。 启动应用程序并在显示这四个 ImageButton 的两个 Activity 之间切换几次,就足以运行 OOM。这些 Activity 通常以特定的 launchMode 启动,方法是:

startActivity(new Intent(this, MyActivity.class));

Android 难道不应该销毁当前未使用的 Activity 以释放内存。相反,我得到了这样一个不断增加的内存使用图:Memory Usage

减少重复出现的 ImageButton 所需资源的最佳做法是什么?有没有办法让我在例如 onDestory() 中明确删除它们?

最佳答案

no-dpi 表示它不适用于密度缩放,而不是“它根本不缩放”。

如果您有 1 个像素的 no-dpi 可绘制对象并以 640x480 显示它(缩放为适合或覆盖),android 将解码资源为 640 * 480 * 4 字节 = ~1.2 MB。你的似乎大约是 55 和 35 MB,所以我假设你将它们缩放到整个屏幕,或者至少是大的。

一遍又一遍地开始一个新的 Activity 只会建立一个堆栈。由于您仍然在同一个任务堆栈中处于 Activity 状态(您只是在其之上添加),Android 不会仅仅破坏该 Activity ;这不同于转到不同的任务堆栈(阅读:启动不同的应用程序,将此应用程序置于后台)。

资源回收由 ImageButtonButton 类处理,因此您不需要显式处理它。如果您想手动执行此操作:

  • 不要在布局中膨胀可绘制对象(因此删除 drawableXXX=...src=...)
  • 使用Bitmap.decodeResource加载图片
  • 在这里你可以设置小尺寸和 BitmapFactory.Options
  • 完成后手动调用 Bitmap#recycle

如果你在onCreate中加载这些,在onDestroy中回收;如果您在 onStart 中加载这些,则在 onStop 中回收;如果您在 onResume 中加载它们,则在 onPause 中回收。

https://stackoverflow.com/questions/37228109/

相关文章:

ios - 如何通过gcdwebserver获取本地html文件

objective-c - 自定义 UIButton 焦点在 tvOS 中无法正常工作

c# - Asp.Net Web Api 在 Godaddy 服务器上不工作,但在本地工作正常

python - Django模型实例的full_clean方法,是这样吗?

google-apps-script - 如何更新谷歌可视化仪表板的底层谷歌数据表并刷新仪表板 Vi

python - 在 Python 中获取页面的所有请求 url

java - Mallet:字母不匹配异常

ios - UIPageViewController 不允许识别 UIScreenEdgePanGe

android - CardView 内的 ExpandableListView 不会改变其父级高度

c# - MongoDB 和 C#,如何按星期比较