【发布时间】:2016-08-14 13:53:22
【问题描述】:
我正在实现一个列表视图来显示 DCIM/Camera 文件夹下的图像列表。我在列表视图上异步加载图像缩略图,并在我的 AsyncTask 实现中使用 ImageView 的强引用,即 ThumbnailReaderTask,这个 AsyncTask 负责加载图像缩略图。有人建议我使用 ImageView 的 WeakReference。我只是好奇在这种特殊情况下使用 WeakReference 会带来什么好处。
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 加载的缩略图位图吗?
【问题讨论】:
标签: java android android-asynctask weak-references