【问题标题】:My application crashes when i load huge amount of bitmaps in arraylist当我在 arraylist 中加载大量位图时,我的应用程序崩溃
【发布时间】:2023-04-11 12:51:01
【问题描述】:

我是 android 编程新手,我在加载位图时遇到问题,我有将近 92 个位图需要加载。但应用程序在 9 或 10 个位图后崩溃.. 请帮助我

这是错误 抛出 OutOfMemoryError “无法分配 22050012 字节分配,1805056 可用字节和 1762KB 直到 OOM” 09-05 19:49:36.188 2615-2615/com.example.zeeshanahmedawan.yourworriestheirsolutions D/skia: --- 缩放位图分配失败

    mPages = new ArrayList<Bitmap>();
    mPages.add(BitmapFactory.decodeResource(getResources(), R.drawable.p1));
    mPages.add(BitmapFactory.decodeResource(getResources(), R.drawable.p2));
    mPages.add(BitmapFactory.decodeResource(getResources(), R.drawable.p3));
    mPages.add(BitmapFactory.decodeResource(getResources(), R.drawable.p4));
    mPages.add(BitmapFactory.decodeResource(getResources(), R.drawable.p5));
    mPages.add(BitmapFactory.decodeResource(getResources(), R.drawable.p6));
    mPages.add(BitmapFactory.decodeResource(getResources(), R.drawable.p7));
    mPages.add(BitmapFactory.decodeResource(getResources(), R.drawable.p8));
    mPages.add(BitmapFactory.decodeResource(getResources(), R.drawable.p9));

【问题讨论】:

  • 使用 LogCat 检查与您的崩溃相关的 Java 堆栈跟踪:stackoverflow.com/questions/23353173/…
  • 抛出 OutOfMemoryError “无法分配 22050012 字节分配,1805056 空闲字节和 1762KB 直到 OOM”09-05 19:49:36.188 2615-2615/com.example.zeeshanahmedawan.yourworriestheirsolutions D/skia: --- 缩放位图分配失败@CommonsWare
  • 我会说你的做法是错误的。将膨胀的位图存储在数组中会不必要地使用大量内存。为什么不只保留资源 ID 的数组或列表,并且仅在需要时(即在 RecyclerView 的适配器中)膨胀?
  • ...它确实让你感到惊讶,对吧?

标签: java android bitmap


【解决方案1】:

如果所有图像的大小都相似,则您尝试分配 ~2028601104 字节 = ~1981055KB = ~1934MB。在您的应用可以使用的大多数 Android 设备上,您有 64MB 或更少的空间。

解码失败的图像大小为 22050012 字节,并且可能已缩放。这相当于 2347 x 2347 像素。很少有 Android 设备具有该分辨率的屏幕。

所以,你需要做几件事:

  1. 停止尝试预先加载所有位图。根据需要加载它们。

  2. 降低位图的分辨率。

  3. 如果您将位图放在res/drawable-nodpi/ 以外的任何目录中,请将它们移动到res/drawable-nodpi/。例如,如果将它们放在res/drawable/ 中,那是res/drawable-mdpi/ 的同义词,表示图像是为mdpi 设备设计的(~160dpi)。 Android 会自动为更高密度的设备放大这些图像。如果您的图像很大,那么 Android 无法进行这种缩放。 res/drawable-nodpi/ 告诉 Android 这些图像与特定密度无关,因此不应以这种方式缩放。

您可能还想重新考虑整个计划。即使对于经验丰富的 Android 应用程序开发人员来说,使用大量位图(更不用说大型位图)也很复杂。内存管理很难。如果您是 Android 新手,也许您应该考虑一个更易于实施的项目。

【讨论】:

    【解决方案2】:

    你的内存不足了。

    您的位图太大,无法存储在数组中。

    【讨论】:

    • 模拟器中的内存量在这种情况下是没有意义的。 OP 正在尝试分配 ~2GB,而每个进程的堆限制将远低于此。
    • 其中有 92 个。我四肢着地,猜测它们的大小都差不多。
    【解决方案3】:
    1. 如果只需要查看照片,可以使用 RecyclerView。它只保留现在屏幕上的一些照片,并释放已经滚动到屏幕外的照片。

    2. 为了其他目的,您可以将所有照片保存到 SD 卡。

    对于情况 1 和 2,请使用特殊库(Glide、Picasso、...)。库易于使用,它们可以自动将下载的图像缓存在 SD 卡上,并具有许多其他好处。搜索“glide with recyclerview”(例如)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-01
      • 1970-01-01
      • 2011-07-04
      • 2020-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多