我有一个列表视图,其中包含图像,当我滚动某个点后,滚动滞后。
我正在使用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);
}