2017-09-05 38 views
-6

我是新来的android编程我在加载位图时遇到问题我有近92位位图,我需要加载。但经过9个或10位图的应用程序崩溃..好心帮我我的应用程序崩溃当我在arraylist中加载大量的位图

这里是“无法与1805056个免费字节,1762KB,直到OOM分配22050012字节分配” 09-05 19:49错误 投掷的OutOfMemoryError: 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

使用LogCat检查与您的崩溃相关的Java堆栈跟踪:https://stackoverflow.com/questions/23353173/uncomfort-myapp-has-stopped-how-can -i-解决 - 这一点。 – CommonsWare

+0

丢失OutOfMemoryError“分配失败,分配失败,无法分配22050012字节分配,1805056个空闲字节和1762KB直到OOM” 09-05 19:49:36.188 2615-2615/com.example.zeeshanahmedawan.yourworriestheirsolutions D/skia:---分配失败缩放的位图 @CommonsWare –

+1

我会说你错误地去了解它。将充气位图存储在数组中会不必要地使用大量内存。为什么不只保留一个数组或资源ID列表,而只需要在RecyclerView的适配器中进行充气? –

回答

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,这些图像没有与特定的密度相关联,因此不应该按照这种方式进行缩放。

您可能还想重新考虑这整个计划。处理大量的位图—更不用说大型的—即使对于有经验的Android应用程序开发人员也很复杂。内存管理很难。如果你对Android陌生,也许你应该考虑一个实现起来更简单的项目。

+0

感谢问题解决。 –

0

您是内存不足。

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

+1

在这种情况下,模拟器中的内存量没有意义。 OP正在尝试分配〜2GB,并且每进程堆的限制将远远小于此。 – CommonsWare

+0

其中有92个。我正在走出一条路,猜测它们都是同样大小的。 – CommonsWare

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

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

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

相关问题