我正在使用 Picasso 从我的服务器加载图像并在 ImageView 中显示它们。
我观察到一些来自用户手机的崩溃报告,其中在 Picasso 尝试将图像加载到 ImageView 时发生内存不足异常。
堆栈跟踪如下:
java.lang.OutOfMemoryError
at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:596)
at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:444)
at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:832)
at android.content.res.Resources.loadDrawable(Resources.java:2988)
at android.content.res.Resources.getDrawable(Resources.java:1558)
at android.widget.ImageView.resolveUri(ImageView.java:646)
at android.widget.ImageView.setImageResource(ImageView.java:375)
at com.squareup.picasso.PicassoDrawable.setPlaceholder(PicassoDrawable.java:62)
at com.squareup.picasso.RequestCreator.into(RequestCreator.java:520)
at com.squareup.picasso.RequestCreator.into(RequestCreator.java:462)
at com.mycompany.myAdapter.getView(MyAdapter.java:102)
at android.widget.AbsListView.obtainView(AbsListView.java:2608)
at android.widget.GridView.makeAndAddView(GridView.java:1346)
MyAdapter.java:102 附近的代码如下:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
.....Some code .....
Picasso.with(mContext)
.load(url_to_server)
.placeholder(R.drawable.default_placeholder)
.into(holder.imageItem); // Line 102
.....Some code .....
return convertView;
}
我使用这个库的方式有问题吗?
最佳答案
我们可以使用 .setImageResource(image) 来加载像启动器图标这样的小图像,但是,加载大图像最好使用 Picasso 并获得简单性和本地缓存的好处。
需要根据文档正确设置Picasso:
“请务必在加载到 ImageView 之前使用 fit() 调整图像大小。否则,如果渲染大量图片,您将消耗额外的内存、滚动缓慢或遇到内存不足的问题。”
if (imageUri != null && !imageUri.isEmpty()) {
Picasso.with(context).load(imageUri)
.fit().centerCrop()
.placeholder(R.drawable.user_placeholder)
.error(R.drawable.user_placeholder_error)
.into(imageView);
}
关于android - picasso 在加载图像时内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24916867/