我刚刚开始开发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()?
答案 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-dpi
和ImageButton
类处理,因此您无需明确处理。如果您想手动执行此操作:
Button
或drawableXXX=...
)src=...
Bitmap.decodeResource
BitmapFactory.Options
如果您在Bitmap#recycle
中加载这些内容,请在onCreate
中回收;如果您在onDestroy
中加载这些内容,请在onStart
中回收;如果您在onStop
中加载这些内容,请在onResume
中回收。