Picasso OutOfMemoryError:

时间:2018-05-01 19:42:34

标签: android picasso

  for (int i = 1; i <= content.getPptPageCount(); i++) {
                        final String thumbNailPath = ImageUtils.getThumbNailPathsForLocalContent(contentID, i);
                        final Bitmap bmp = Picasso.with(AppManagers.getAppContext().getContext())
                                .load(ProxyPathHandler.getProxyURLSlide(content.getPresentationFileID(), i))
                                .get();
                        ImageUtils.writeBitmapToFile(bmp, thumbNailPath);
                        thumbNailPathList.add(thumbNailPath);
                    }

get()尝试Picasso位图时,我收到此错误

  

引起:java.lang.OutOfMemoryError:无法分配49486856   字节分配有16777216个空闲字节,31MB直到OOM         at dalvik.system.VMRuntime.newNonMovableArray(Native Method)〜[na:0.0]         在android.graphics.BitmapFactory.nativeDecodeStream(Native方法)〜[na:0.0]         在android.graphics.BitmapFactory.decodeStreamInternal(BitmapFactory.java:773)   〜[NA:0.0]         在android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:749)   〜[NA:0.0]         在com.squareup.picasso.BitmapHunter.decodeStream(BitmapHunter.java:142)   〜[NA:0.0]         在com.squareup.picasso.BitmapHunter.hunt(BitmapHunter.java:217)〜[na:0.0]         在com.squareup.picasso.RequestCreator.get(RequestCreator.java:396)   〜[NA:0.0]         在com.allego.android.app.manager.ContentManager $ 70.call(ContentManager.java:2969)   〜[NA:0.0]         在com.allego.android.app.manager.ContentManager $ 70.call(ContentManager.java:2947)   〜[NA:0.0]         at io.reactivex.internal.operators.single.SingleFromCallable.subscribeActual(SingleFromCallable.java:35)   〜[NA:0.0]         在io.reactivex.Single.subscribe(Single.java:2702)〜[na:0.0]         at io.reactivex.internal.operators.single.SingleSubscribeOn $ SubscribeOnObserver.run(SingleSubscribeOn.java:89)   〜[NA:0.0]         在io.reactivex.Scheduler $ DisposeTask.run(Scheduler.java:451)〜[na:0.0]         at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:61)   〜[NA:0.0]

我有点可以通过添加

来解决这个问题
 android:largeHeap="true"
 android:hardwareAccelerated="false"

但我想提前找到另一种解决方案。

2 个答案:

答案 0 :(得分:1)

您需要加载较小的图像。如果您正在寻找缩略图,则应该有一项服务可以将图像缩放为缩略图大小。也许160x160像素并以这种方式管理它。你正在处理太大的图像。

但是,如果你坚持使用大图像,你至少可以让Picassa为你或Glide缩放它们。

例如。 Glide可以覆盖大小,因此您不必花费所有内存资源来绘制像素。

{{1}}

Picassa会做同样的事情。

答案 1 :(得分:0)

您可以如下计算分配图像所需的内存量:

Memory (Byte) = width(pixel) * height(pixel) * sf (scaling factor) * depth (bytes/pixel)

其中:
宽度和高度:图像尺寸像素
sf:电话密度(dp /像素比率)。例如,在480 dpi规格=> 480/160 = 3或xxhdpi
的电话中 深度::图像的位深度。例如,您可以通过简单的Linux命令identify -verbose fullImageName找到该值。

希望对您有帮助。