我是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));
答案 0 :(得分:2)
如果所有图像的大小相似,则尝试分配~2028601104字节= ~1981055KB = ~1934MB。您的应用可以使用的大多数Android设备上的64MB或更少。
您失败的图像大小为22050012字节,解码后可能会缩放。这相当于2347 x 2347像素。很少有Android设备拥有该分辨率的屏幕。
所以,你需要做几件事:
停止尝试预先加载所有位图。根据需要加载它们。
降低位图的分辨率。
如果您将位图放在res/drawable-nodpi/
以外的任何目录中,请将它们移至res/drawable-nodpi/
。例如,如果您将它们放在res/drawable/
中,这是res/drawable-mdpi/
的同义词,表示图像是为mdpi
设备设计的(~160dpi)。 Android会自动将这些图像缩放到更高密度的设备。如果您的图像很大,那么Android就无法进行这种缩放。 res/drawable-nodpi/
告诉Android这些图片与特定密度无关,因此不应按此方式缩放。
您可能还想重新考虑整个计划。使用大量位图 - 更不用说大型位图 - 即使对于经验丰富的Android应用程序开发人员来说也很复杂。内存管理很难。如果您不熟悉Android,也许您应该考虑一个更容易实现的项目。
答案 1 :(得分:0)
你的记忆力不足。
您的位图太大而无法存储在数组中。
答案 2 :(得分:0)
如果您只需要查看照片,可以使用RecyclerView。它只在内存中保存一些现在在屏幕上的照片,并释放已经滚出屏幕的照片。
出于其他目的,您可以将所有照片保存到SD卡。
对于两种情况1&amp; 2使用特殊库(Glide,Picasso,......)。库易于使用,它们可以自动将下载的图像缓存在SD卡上,并具有许多其他好处。通过recyclerview&#34;搜索&#34;滑行(例如)