我从"Android in Practice“一书中得到了以下代码。它实现了自定义适配器,从互联网下载图像。它使用私有类RetrieveImageTask检索图片。
有人能解释一下为什么适配器类做的第一件事就是从缓存中获取图像而不是下载它吗?我理解它的一种方式是,当它第一次显示在getView()开头设置的默认图像时,然后设置下载的图像,但这是否意味着通过调用getView()不断刷新视图?
为什么作者在getView()中将图像标记设置为项ID,然后在onPostExecute()中将其设置为null?
DealsAdapter
private class DealsAdapter extends ArrayAdapter<Item> {
public DealsAdapter(List<Item> items) {
super(DealList.this, R.layout.list_item, items);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.list_item, parent, false);
}
// use ViewHolder here to prevent multiple calls to findViewById (if you have a large collection)
TextView text = (TextView) convertView.findViewById(R.id.deal_title);
ImageView image = (ImageView) convertView.findViewById(R.id.deal_img);
image.setImageBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.ddicon));
Item item = getItem(position);
if (item != null) {
text.setText(item.getTitle());
Bitmap bitmap = app.getImageCache().get(item.getItemId()); //<------HERE
if (bitmap != null) {
image.setImageBitmap(bitmap);
} else {
// put item ID on image as TAG for use in task
image.setTag(item.getItemId());
// separate thread/via task, for retrieving each image
// (note that this is brittle as is, should stop all threads in onPause)
new RetrieveImageTask(image).execute(item.getSmallPicUrl());
}
}
return convertView;
}
}RetriveImageTask
private class RetrieveImageTask extends AsyncTask<String, Void, Bitmap> {
private ImageView imageView;
public RetrieveImageTask(ImageView imageView) {
this.imageView = imageView;
}
@Override
protected Bitmap doInBackground(String... args) {
Bitmap bitmap = app.retrieveBitmap(args[0]);
return bitmap;
}
@Override
protected void onPostExecute(Bitmap bitmap) {
if (bitmap != null) {
imageView.setImageBitmap(bitmap);
app.getImageCache().put((Long) imageView.getTag(), bitmap);
imageView.setTag(null);
}
}}
发布于 2013-12-27 13:22:55
这叫做懒惰装载。那么,图片需要时间从网络下载,所以通过一些虚拟图像被设置。下载完成后,它将被虚拟图像所取代。基本上是用户体验和应用的问题。
发布于 2013-12-27 15:37:51
标记与代码的缓存机制有关--在这个示例中,条目的关键是它们的编号,这意味着它用于识别下载的图像,这样您就可以从缓存而不是从internet加载它。
我同意,这是奇怪的,因为它可以简单地把图片的网址。使用url更符合逻辑。
该示例的效率不高,因为它没有使用viewHolder设计模式(您可以通过“listView的世界”讲座了解它),也没有对其进行下采样(您可以查看this post )。
在显示正确图像之前所显示的图像是用于向用户显示正在准备的图像(就像占位符,上面写着“下载.”)。
这只是一个供你学习的样本。
https://stackoverflow.com/questions/20801435
复制相似问题