毕加索不能始终如一地发挥作用

时间:2015-07-02 11:30:29

标签: android picasso

我有一个gridview,有很多瓷砖 - 几百个。所有数据都是从网络服务中收集的。

每个网格单元有两个TextView,一个Button和一个ImageView。

我绝对无法使用我编写的原始代码加载图像,应用程序会崩溃每次单次给OOM,所以我决定使用Picasso。顺便说一下,我的asynctasks工作正常。

我必须说,实施不仅更简单,而且我的应用程序甚至没有崩溃过一次。

然而,当毕加索将显示图像时,它似乎对我来说似乎不是完全随机的 -

  1. 有时,在目前正在查看的单元格中显示图像需要很长时间(按年龄我的意思是30-40秒)。

  2. 在其他情况下,2-3张图片会立即加载,然后没有其他图像会加载。我向下滚动,在10-20个细胞间隙后看到一些图像。然后另一个差距。然后是一些图片。

  3. 我可以看到它正在缓存图像,但显然存在一些问题。当我滚回到我已经去过的地方时,它似乎“重新加载”了这些图像。

  4. 一旦我重新启动模拟器,一切都完美无瑕。 完美无缺。下次不一样。下次我重新启动模拟器时不是这样。

  5. 我不会说毕加索不可靠,因为我更多的机会以其他方式搞砸了我的记忆管理。但是,如果我有,我无法指出它。

    这是我的适配器类 -

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

    任何帮助将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:0)

您尝试加载的图像似乎很大。因此,您可以尝试向Picasso方法链添加调整大小:

Picasso.with(dvh.pic.getContext())
       .load(deal.getPhoto_link())
       .noFade()
       .resize(width, height) // <-- ImageView size in cell
       .into(dvh.pic);

它会减少内存消耗。此外,如果您的API允许您获取缩略图而不是完整版本的图像,则最好在网格视图中下载它们。