即使使用Picasso

时间:2015-06-03 17:08:24

标签: android android-listview android-imageview picasso

我有一个列表视图,其中包含图像,当我滚动某个点后,滚动滞后。

我正在使用Picasso和以下代码来确保图像在后台线程中加载到内存中。

    picasso
        .load(f)
        .fit()
        .error(R.drawable.broken_image)
        .into(viewHolder.imageView, loadDoneCallback);

如果我的所有ListView条目都加载了相同的图片,则没有延迟,因此问题似乎与将图像从内存加载到viewHolder.imageView完全相关。

另一个数据点是我看到运行Android 4.4.4的O + O设备出现延迟。但是,我运行Android 5.1的Nexus 5似乎没有这个问题。两者似乎都使用大约128MB +的堆大小。每个拇指大约40KB,每行3个大拇指,总共50行(我看到了前10行后的滞后),我在内存中的总图像大小应该是~6MB,所有图像都应该适合缓存(甚至虽然加载是在后台线程中完成的。)

当我通过向上和向下滚动多次重新创建问题时,我设法收到Skipped x frames消息。

06-03 22:24:30.279    2382-2382/xxx I/Choreographer﹕ Skipped 58 frames!  The application may be doing too much work on its main thread.

同样,我假设主线程中发生的这项工作与Picasso从其缓存加载到ImageView的各个图像有关。我假设它不能与任何其他布局相关的计算等相关,因为对所有ListView条目使用相同的图像可以很好地工作。

这是预期还是我犯了一些菜鸟错误?

更新:这是我的getView代码

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    View view;
    ViewHolder viewHolder = new ViewHolder();
    final String imageId = getItem(position);
    if (convertView == null) {
        view = inflator.inflate(R.layout.image_row_home, parent, false);
        viewHolder.imageView = (ImageView) view.findViewById(R.id.img);
        viewHolder.imageView.getLayoutParams().height = imageWidth;
        viewHolder.imageView.getLayoutParams().width = imageWidth;
        viewHolder.imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
        viewHolder.imageId = imageId;
        view.setTag(viewHolder);
    } else {
        view = convertView;
        viewHolder = ((ViewHolder) view.getTag());
        // If this view is already for the image we want, no need to recreate it.
        if (viewHolder.imageId.equals(imageId)) {
            return view;
        }
        viewHolder.imageId = imageId;
    }

    final File f = getImageFileForPosition(position);
    picasso
        .load(f)
        .fit()
        .error(R.drawable.broken_image)
        .into(viewHolder.imageView);
}

0 个答案:

没有答案