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
.
希望对您有所帮助。
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
.
希望对您有所帮助。