相同的ImageButtons消耗大量内存

时间:2016-05-14 14:52:29

标签: android memory-leaks imagebutton

我刚刚开始开发Android应用并面临内存问题。使用Android工作室的分配跟踪功能,我发现在多个活动中显示的四个ImageButton最有可能导致问题。分配跟踪结果显示几乎所有内存都被两种方法用于图像。看到: Allocation Tracking result

按钮的drawable是小图标,大小 20 KB ,位于 drawable-nodpi 。这样Android就不必对缩放它们做任何事情。 启动应用程序并在两个显示这四个ImageButton的活动之间切换几次就足以运行OOM。这些活动通常使用特定的 launchMode 启动:

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

Android不应该为了释放内存而使用目前尚未使用的目标活动。相反,我得到了一个增加的内存使用率图:Memory Usage

降低重复使用ImageButtons所需资源的良好做法是什么?有没有办法让我明确删除它们,例如 onDestory()

1 个答案:

答案 0 :(得分:0)

server { listen 80; server_name localhost; root /var/www/html; autoindex on; location / { index index.php index.html; } location ~ \.php$ { fastcgi_pass web_fpm:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name; include fastcgi_params; } } 意味着它不适用于密度缩放,而不是"它根本不会缩放,而且#34;。

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

反复开始新活动只会构建一个堆栈。由于您仍然在同一个任务堆栈中活跃(您只是在其上添加),Android不会破坏活动;这与进入不同的任务堆栈不同(阅读:启动另一个应用程序,将此应用程序置于后台)。

资源回收由no-dpiImageButton类处理,因此您无需明确处理。如果您想手动执行此操作:

  • 不要在您的布局中为drawable充气(因此请移除ButtondrawableXXX=...
  • 使用src=...
  • 加载图片
  • 在这里您可以设置小尺寸和Bitmap.decodeResource
  • 完成后手动致电BitmapFactory.Options

如果您在Bitmap#recycle中加载这些内容,请在onCreate中回收;如果您在onDestroy中加载这些内容,请在onStart中回收;如果您在onStop中加载这些内容,请在onResume中回收。