Java 从internet检索图像
我从“Android在实践”一书中得到了以下代码。它是一个自定义适配器的实现,用于从internet下载图像。它使用私有类Java 从internet检索图像,java,android,Java,Android,我从“Android在实践”一书中得到了以下代码。它是一个自定义适配器的实现,用于从internet下载图像。它使用私有类RetrieveImageTask来检索图片 有人能解释一下为什么适配器类要做的第一件事是从缓存中获取映像,而不是下载它吗?我对它的理解是,它第一次出现的时候 在getView()开头设置的默认图像,然后设置下载的图像,但这是否意味着通过调用getView()不断刷新视图 为什么作者在getView()中将图像的标记设置为项目ID,然后在onPostExecute()中将其设
RetrieveImageTask
来检索图片
有人能解释一下为什么适配器类要做的第一件事是从缓存中获取映像,而不是下载它吗?我对它的理解是,它第一次出现的时候
在getView()
开头设置的默认图像,然后设置下载的图像,但这是否意味着通过调用getView()
不断刷新视图
为什么作者在getView()
中将图像的标记设置为项目ID,然后在onPostExecute()中将其设置为null
DealsAdapter
私有类DealsAdapter扩展了ArrayAdapter{
公共事务处理适配器(列表项){
super(DealList.this,R.layout.list\u项,项);
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
if(convertView==null){
LayoutFlater充气器=(LayoutFlater)getSystemService(Context.LAYOUT\u充气器\u服务);
convertView=充气机。充气(R.layout.list_项,父项,false);
}
//在此处使用ViewHolder可防止多次调用findViewById(如果您有大量集合)
TextView text=(TextView)convertView.findViewById(R.id.deal\u title);
ImageView image=(ImageView)convertView.findViewById(R.id.deal\u img);
setImageBitmap(BitmapFactory.decodeResource(getResources(),R.drawable.ddicon));
项目=获取项目(位置);
如果(项!=null){
setText(item.getTitle());
位图位图=app.getImageCache().get(item.getItemId())//它被称为延迟加载。图像从网络下载需要时间,因此设置了一些虚拟图像。下载完成后,它将被虚拟图像所取代。基本上是用户体验应用程序的问题。标签与代码的缓存机制如何工作有关-项目的关键是它们的numb呃,在这个示例中,这意味着它用于识别下载的图像,以便您可以从缓存而不是从internet加载它
我同意这很奇怪,因为它可以简单地把图片的url放在这里,使用url更符合逻辑
该示例效率不高,因为它没有使用viewHolder设计模式(您可以通过“listView的世界”课程了解它),并且没有考虑下采样(您可以查看它)
在显示正确图像之前显示的图像用于向用户显示它正在准备(如占位符“下载…”)
这只是一个供你学习的样本
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;
}
}
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);
}
}