我有一个gridview,有很多瓷砖 - 几百个。所有数据都是从网络服务中收集的。
每个网格单元有两个TextView,一个Button和一个ImageView。
我绝对无法使用我编写的原始代码加载图像,应用程序会崩溃每次单次给OOM,所以我决定使用Picasso。顺便说一下,我的asynctasks工作正常。
我必须说,实施不仅更简单,而且我的应用程序甚至没有崩溃过一次。
然而,当毕加索将显示图像时,它似乎对我来说似乎不是完全随机的 -
有时,在目前正在查看的单元格中显示图像需要很长时间(按年龄我的意思是30-40秒)。
在其他情况下,2-3张图片会立即加载,然后没有其他图像会加载。我向下滚动,在10-20个细胞间隙后看到一些图像。然后另一个差距。然后是一些图片。
我可以看到它正在缓存图像,但显然存在一些问题。当我滚回到我已经去过的地方时,它似乎“重新加载”了这些图像。
一旦我重新启动模拟器,一切都完美无瑕。 完美无缺。下次不一样。下次我重新启动模拟器时不是这样。
我不会说毕加索不可靠,因为我更多的机会以其他方式搞砸了我的记忆管理。但是,如果我有,我无法指出它。
这是我的适配器类 -
package com.tech4i.hujum;
// all imports
@SuppressLint("NewApi")
public class DealsAdapter extends BaseAdapter {
private Context mContext;
int width;
public static List<Deals> deals_list;
Deals deal;
DealsViewHolder dvh;
AbsListView.LayoutParams layoutParams;
LayoutInflater inflater = null;
public DealsAdapter(Context context, List<Deals> objects) {
mContext = context;
deals_list = objects;
inflater = (LayoutInflater) mContext
.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
}
// ViewHolder
class DealsViewHolder {
ImageView pic;
TextView details;
TextView price;
Button button;
}
@SuppressLint("ViewHolder")
@Override
public View getView(int position, View convertView, ViewGroup parent) {
width = (int) ((MainActivity.width * 0.23 * mContext.getResources()
.getDisplayMetrics().density) + 0.5);
layoutParams = new AbsListView.LayoutParams(width, (int) (width * 0.95));
if (convertView == null) {
convertView = inflater.inflate(R.layout.gridcell_deals, parent,
false);
convertView.setLayoutParams(layoutParams);
dvh = new DealsViewHolder();
dvh.details = (TextView) convertView
.findViewById(R.id.deal_details);
dvh.price = (TextView) convertView.findViewById(R.id.deal_price);
dvh.pic = (ImageView) convertView.findViewById(R.id.deal_picture);
dvh.button = (Button) convertView
.findViewById(R.id.deal_shop_now_button);
convertView.setTag(dvh);
} else {
dvh = (DealsViewHolder) convertView.getTag();
}
deal = deals_list.get(position);
Picasso.with(dvh.pic.getContext()).load(deal.getPhoto_link()).noFade()
.into(dvh.pic);
dvh.details.setText(deal.getDescription());
dvh.price.setText(deal.getValue() + " /-");
return convertView;
}
}
任何帮助将不胜感激。谢谢!
答案 0 :(得分:0)
您尝试加载的图像似乎很大。因此,您可以尝试向Picasso方法链添加调整大小:
Picasso.with(dvh.pic.getContext())
.load(deal.getPhoto_link())
.noFade()
.resize(width, height) // <-- ImageView size in cell
.into(dvh.pic);
它会减少内存消耗。此外,如果您的API允许您获取缩略图而不是完整版本的图像,则最好在网格视图中下载它们。