我正在实现一个列表视图来显示DCIM/Camera文件夹下的图像列表。我在异步列表视图中加载图像缩略图,并在我的AsyncTask实现中使用ImageView的强引用,即ThumbnailReaderTask,此AsyncTask负责加载图像缩略图。我被建议使用ImageView的WeakReference。我只是好奇,在这种特殊场景中使用WeakReference会有什么好处。WeakReference vs Android中的强引用AsyncTask
Java文档表明
假设垃圾回收器确定在某一时间点,对象是弱可。那时它会原子地清除对该对象的所有弱引用,以及通过一系列强和软引用可访问该对象的任何其他弱可访问对象的所有弱引用。
这是我的代码(为了简单起见,我只是分享我的适配器实现ListView和ThumbnailReaderTask)。
ImageListEntry
//The model class
public class ImageListEntry {
String m_name;
public String getName(){
return m_name;
}
public void setName(String value){
m_name = value;
}
File m_file;
public File getFile(){
return m_file;
}
public void setFile(File value){
m_file = value;
}
}
ImageListAdapter
public class ImageListAdapter extends BaseAdapter {
Activity m_context;
List<ImageListEntry> m_images;
public ImageListAdapter(Activity context, List<ImageListEntry> images){
this.m_context = context;
this.m_images = images;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public Object getItem(int position) {
return m_images.get(position);
}
@Override
public int getCount() {
return m_images.size();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ImageListEntry currentImage = m_images.get(position);
TextView nameTextView = (TextView)convertView.findViewById(R.id.explorer_resName);
nameTextView.setText("Set some text...");
ImageView thumbnailImageView = (ImageView)convertView.findViewById(R.id.explorer_resIcon);
//Asynchronous image loading
new ThumbnailReaderTask(thumbnailImageView).execute(currentImage.getFile());
return convertView;
}
}
ThumbnailReaderTask
public class ThumbnailReaderTask extends AsyncTask<File, Void, Bitmap> {
//Should use WeakReference<ImageView>m_imageViewReference
private final ImageView m_imageView;
public ThumbnailReaderTask(ImageView imageView) {
m_imageView = imageView;
}
@Override
protected Bitmap doInBackground(File... params) {
return readBitmapFromFile(params[0]);
}
@Override
protected void onPostExecute(Bitmap bitmap) {
ImageView imageView = m_imageView;//m_imageViewReference.get();
if (imageView != null) {
if (bitmap != null) {
imageView.setImageBitmap(bitmap);
}else {
Drawable placeholder = imageView.getContext().getResources().getDrawable(R.mipmap.filetype_image);
imageView.setImageDrawable(placeholder);
}
}
}
private Bitmap readBitmapFromFile(File file){
//read thumbnail and return;
}
}
这将有助于清理为ImageView加载的缩略图位图吗?
您还拥有来自volley的NetworkImageView。很容易与 – peter
@Laser一起使用,这个NetworkImageView对我来说是新的。谢谢! –