【问题标题】:Android Out of memory small bitmapAndroid Out of memory 小位图
【发布时间】:2023-03-27 02:55:01
【问题描述】:

我只是在使用以下代码时偶尔出现内存不足错误

    public class MyActivity extends Activity  {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

    // CODE FOR PUTTING BITMAP ON BACKGROUND
    String pathName = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString()
            + "/Backgrounds/0.png";
    Resources res = getResources();
    Bitmap bitmap = BitmapFactory.decodeFile(pathName);
    BitmapDrawable bd = new BitmapDrawable(res, bitmap);
    View view = findViewById(R.id.screen1);
    view.setBackgroundDrawable(bd);
    }

位图只有 310k 和我所有活动 (10) 上的相同位图

当从一项活动快速连续切换到另一项活动时,往往会发生这种情况。

任何想法如何提高效率?

感谢任何帮助

标记

【问题讨论】:

  • bitmap is only 310k。你的意思是'png文件只有310KB'!?位图将占用更多内存。
  • 310kb 是您的 png 图像的 压缩 大小。当它被加载到内存中时,它被称为 in memory 大小并且可能不同(通常更多)。导致 OOM 的原因是位图的 in memory 大小。您应该检查您尝试分配多少内存。建议:使用安卓图片加载库。
  • 您可以添加“System.gc();”命令强制 android 垃圾收集器清除内存。
  • 缩小 png。它的分辨率是多少?为什么不直接分配位图?为什么需要转换为 Drawable?
  • 对不起,当我说位图时我的无知我类 png,jpg 作为位图我的意思是图片图片的分辨率为 1280 x 800 与我的平板电脑大小相同文件大小为 310k 我试图设置它作为背景,但图片需要在 sd 卡上才能更改。

标签: android memory memory-management bitmap


【解决方案1】:

您的位图最有可能有多大并不重要。当您收到 OOM 时,这意味着整个系统内存不足。例如,如果你有一个 10MB 的堆,我分配 9.999 MB 然后分配 100 个字节,这 100 个字节将引发异常(因为那是它实际内存不足的时候)。真正的问题是第一次分配。

使用 System.gc 是一种可怕的 hack,实际上并不能解决您的问题 - 它最多只会延迟您看到它。你有内存泄漏。您需要修复此内存泄漏,如果不是现在,那么最终。泄漏几乎肯定是关于您的 Activity 对象的泄漏引用。回到你的应用,运行一些堆分析器,然后找出你的漏洞在哪里。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多