“java.lang.OutOfMemoryError”
.我想是因为我用了毕加索在我的RecycleView适配器。
代码如下:
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.squareup.picasso.Picasso;
import java.util.List;
import uk.co.something.R;
import uk.co.something.Product;
public class ProductListAdapter extends RecyclerView.Adapter<ProductListAdapter.ViewHolder> {
private List<Product> products;
private int rowLayout;
private Context appContext;
public ProductListAdapter(List<Product> products, int rowLayout, Context appContext) {
this.products = products;
this.rowLayout = rowLayout;
this.appContext = appContext;
}
@Override
public ProductListAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View v = LayoutInflater.from(viewGroup.getContext()).inflate(rowLayout, viewGroup, false);
return new ProductListAdapter.ViewHolder(v);
}
@Override
public void onBindViewHolder(ProductListAdapter.ViewHolder viewHolder, int i) {
Product product = products.get(i);
Picasso.with(appContext).load(product.getUrl().getImage()).into(viewHolder.image);
Picasso.with(appContext).load(product.getRetailer().getIcon()).into(viewHolder.logo);
String productPrice = (product.getPrice().getDiscounted() == null || Double.parseDouble(product.getPrice().getDiscounted()) <= 0) ? product.getPrice().getCost() : product.getPrice().getDiscounted();
viewHolder.price.setText("\u00a3" + productPrice);
}
@Override
public int getItemCount() {
return products == null ? 0 : products.size();
}
static class ViewHolder extends RecyclerView.ViewHolder {
public ImageView image;
public ImageView logo;
public TextView price;
ViewHolder(View itemView) {
super(itemView);
image = (ImageView) itemView.findViewById(R.id.product_list_cardview_image);
logo = (ImageView) itemView.findViewById(R.id.product_list_cardview_logo);
price = (TextView) itemView.findViewById(R.id.product_list_cardview_price);
}
}
}
View v = LayoutInflater.from(viewGroup.getContext()).inflate(rowLayout, viewGroup, false);
您会得到java.lang.OutOfMemoryError
错误,因为您的应用程序超出了提供给它的总内存。
在您的应用程序中,这可能是因为您在recyclerView中显示的图像尺寸较大,并且在显示之前未将其缩放到imageview的大小
为了使用Picasso正确缩放图像,可以使用Picasso中的.fit()方法
Picasso
.with(context)
.load(UsageExampleListViewAdapter.eatFoodyImages[0])
.fit()
// call .centerInside() or .centerCrop() to avoid a stretched image
.into(imageViewFit);
或者你可以用Glide代替毕加索
compile 'com.github.bumptech.glide:glide:3.7.0'
例如
Glide.with(context)
.load(image)
.asBitmap().transform(new CenterCrop(context))
.diskCacheStrategy( DiskCacheStrategy.NONE )
.skipMemoryCache( true )
.into(your_imageview)
您还可以通过在清单中启用大型堆来增加分配给应用程序的默认内存
android:largeHeap="true"
问题内容: 我正在使用Picasso在我的android应用中显示图像: 我已启用调试,并且始终显示红色和绿色。但是从不显示黄色 现在,如果我下次加载同一张图片,并且互联网不可用,则无法加载图片。 问题: 它没有本地磁盘缓存吗? 我如何启用磁盘缓存,因为我将多次使用相同的映像。 我是否需要向Android清单文件添加一些磁盘权限? 问题答案: 这就是我所做的。效果很好。 首先将OkHttp添加到a
问题内容: 谁能给我一个例子,说明如何使用Picasso来以编程方式更改XML布局的背景吗?我发现的所有示例都可以使用Picasso更新ImageView,但不能更新布局背景。 问题答案: 您可以使用毕加索的目标: 更新 正如@BladeCoder在评论中提到的那样,毕加索对目标对象的引用很弱,因此很可能会被垃圾回收。 因此,在杰克·沃顿就其中一个问题发表评论之后,我认为这可能是一个不错的选择:
正如你可以看到的使用链接,毕加索只有3个选项加载一个图像。我的问题是,如果您有一个从API的JSON响应解析的base64字符串,那么如何加载图像?
我正在尝试记录来自iPhone加速度计(我自己的iPhone5s)的数据,并使用在屏幕上为该数据设置标签,其中data是我要记录的特定轴的值。为此,我设置了一个CMMotionManager并开始记录加速度计数据,并且我有一个定时器可以不断更新标签中的文本。但是,我从Xcode收到一个错误:“致命错误:在展开可选值时意外发现为nil”。以下是相关代码: 当我更改accelX时,错误停止。文本赋值给
问题内容: 我知道毕加索将图像加载到imageview等中,但是如何使用毕加索设置布局背景图像? 我的代码: 我在这里遇到的任何错误都表明它无法解决。我有一个ScrollView和相对布局。 问题答案: 使用毕加索的回调 更新: 也请检查此内容。如评论中提到的@OlivierH。
我尝试用自定义身份验证器设置自定义OkHttpClient,但是正如文档所说:“响应来自远程web或代理服务器的身份验证挑战。”我必须为每个图像提出2个请求,这是不理想的。 谢了!