Picasso OutOfMemoryError:

Picasso OutOfMemoryError:

  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);
                    }

尝试从 Picasso get() 位图时出现此错误

Caused by: java.lang.OutOfMemoryError: Failed to allocate a 49486856 byte allocation with 16777216 free bytes and 31MB until OOM at dalvik.system.VMRuntime.newNonMovableArray(Native Method) ~[na:0.0] at android.graphics.BitmapFactory.nativeDecodeStream(Native Method) ~[na:0.0] at android.graphics.BitmapFactory.decodeStreamInternal(BitmapFactory.java:773) ~[na:0.0] at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:749) ~[na:0.0] at com.squareup.picasso.BitmapHunter.decodeStream(BitmapHunter.java:142) ~[na:0.0] at com.squareup.picasso.BitmapHunter.hunt(BitmapHunter.java:217) ~[na:0.0] at com.squareup.picasso.RequestCreator.get(RequestCreator.java:396) ~[na:0.0] at com.allego.android.app.manager.ContentManager.call(ContentManager.java:2969) ~[na:0.0] at com.allego.android.app.manager.ContentManager.call(ContentManager.java:2947) ~[na:0.0] at io.reactivex.internal.operators.single.SingleFromCallable.subscribeActual(SingleFromCallable.java:35) ~[na:0.0] at 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] at 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"

不过我想另寻他路,先谢谢了

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

不过,如果你坚持使用大图,你至少可以让 Picasa 为你或 Glide 缩放它们。

例如。 Glide 可以覆盖大小,因此您不会将所有内存资源都花在绘制像素上。

Glide
 .with(context)
 .load(yourImageUrl)
 .override(200, 200)
 .into(imageView);

Picassa 也会做同样的事情。

您可以计算出分配一个图像需要多少内存,如下所示:

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

其中:
宽度和高度: 是图像尺寸 到像素
sf: phone密度(dp/pixel口粮)。例如在具有 480 dpi 规格的 phone => 480/160 = 3 或 xxhdpi
深度: 图像的位深度。例如,您可以通过简单的 Linux 命令找到此值:identify -verbose fullImageName.

希望对您有所帮助。