当我在arraylist中加载大量的位图时,我的应用程序崩溃了

时间:2017-09-05 14:42:50

标签: java android bitmap

我是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));

3 个答案:

答案 0 :(得分:2)

如果所有图像的大小相似,则尝试分配~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这些图片与特定密度无关,因此不应按此方式缩放。

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

答案 1 :(得分:0)

你的记忆力不足。

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

答案 2 :(得分:0)

  1. 如果您只需要查看照片,可以使用RecyclerView。它只在内存中保存一些现在在屏幕上的照片,并释放已经滚出屏幕的照片。

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

  3. 对于两种情况1&amp; 2使用特殊库(Glide,Picasso,......)。库易于使用,它们可以自动将下载的图像缓存在SD卡上,并具有许多其他好处。通过recyclerview&#34;搜索&#34;滑行(例如)