毕加索内存崩溃

时间:2014-12-12 12:43:31

标签: android memory

我在我的应用程序中使用picasso进行图像管理。 从服务器检索图像。一些图像在1.5-2 MB中相当大 图像下载&那部分似乎很好。 经过一段时间我的应用程序崩溃内存不足。 但是这些图像仅从3幅图像的res(大约200kb)中检索出来。 12-12 12:50:17.260:E / AndroidRuntime(32715):致命异常:主要 12-12 12:50:17.260:E / AndroidRuntime(32715):java.lang.OutOfMemoryError :(堆大小= 49187KB,分配= 47999KB) 12-12 12:50:17.260:E / AndroidRuntime(32715):在android.graphics.BitmapFactory.nativeDecodeAsset(Native Method) 12-12 12:50:17.260:E / AndroidRuntime(32715):在android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:486) 12-12 12:50:17.260:E / AndroidRuntime(32715):在android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:773) 12-12 12:50:17.260:E / AndroidRuntime(32715):在android.content.res.Resources.loadDrawable(Resources.java:2044) 12-12 12:50:17.260:E / AndroidRuntime(32715):在android.content.res.Resources.getDrawable(Resources.java:675) 12-12 12:50:17.260:E / AndroidRuntime(32715):at com.onmobile.rbt.signal.ui.activities.interfaces.ImageClass.bringInfromRight(ImageClass.java:144) 12-12 12:50:17.260:E / AndroidRuntime(32715):at com.onmobile.rbt.signal.ui.activities.interfaces.ImageClass.access $ 3(ImageClass.java:133) 12-12 12:50:17.260:E / AndroidRuntime(32715):at com.onmobile.rbt.signal.ui.activities.interfaces.ImageClass $ 2.run(ImageClass.java:74) 12-12 12:50:17.260:E / AndroidRuntime(32715):在android.os.Handler.handleCallback(Handler.java:608) 12-12 12:50:17.260:E / AndroidRuntime(32715):在android.os.Handler.dispatchMessage(Handler.java:92) 12-12 12:50:17.260:E / AndroidRuntime(32715):在android.os.Looper.loop(Looper.java:156) 12-12 12:50:17.260:E / AndroidRuntime(32715):在android.app.ActivityThread.main(ActivityThread.java:4987) 12-12 12:50:17.260:E / AndroidRuntime(32715):at java.lang.reflect.Method.invokeNative(Native Method) 12-12 12:50:17.260:E / AndroidRuntime(32715):at java.lang.reflect.Method.invoke(Method.java:511) 12-12 12:50:17.260:E / AndroidRuntime(32715):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:784) 12-12 12:50:17.260:E / AndroidRuntime(32715):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 12-12 12:50:17.260:E / AndroidRuntime(32715):at dalvik.system.NativeStart.main(Native Method)

2 个答案:

答案 0 :(得分:0)

你必须使用小尺寸的图像。看看这个网站https://developer.android.com/training/displaying-bitmaps/load-bitmap.html。用过的内存不是直接限制文件大小。它是关于图像维度的。当OS(几乎所有操作系统)绘制图像时,首先它将此图像作为位图并将其放入堆中。位图通常为每个像素分配4个字节(ARGB)。并且,位图具有宽度*高度像素。所以,例如,如果你有5000x5000只使用2色,它可以是文件大小10k的大小。文件大小太小,因为已知的图像格式,如jpeg,png,使用压缩算法。和2色意味着,这个图像可以很好地压缩。虽然文件大小太小,但它可以保持5000 * 5000 * 4(ARGB)= 100.000.000字节,堆中100MB。如果您加载这样的几个图像,您可以轻松地开始使用1GB内存(如果可以)作为堆

答案 1 :(得分:0)

尝试使用Fresco 也许这会解决问题? 这与毕加索的概念几乎相同。 但也请阅读article。 或Google推荐的是使用Google推荐的Glide