2016-08-14 39 views
0

我正在实现一个列表视图来显示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加载的缩略图位图吗?

回答

2

这将有助于清洗缩略图位图被加载为 ImageView?

是的。弱参考将允许GC清除m_imageView和所有可到达的对象,以防m_imageView在某些时刻保持弱可达性。这可能发生(例如)如果Activity持有m_imageView被破坏,而您的AsyncTask正在加载一个新的位图。

但是,我建议你不要走这条路,而是使用其中一个可用库来异步加载图像。原因很简单:这是不平凡和耗时的任务,你需要解决大量的错误。查看UniversalImageLoader或Picasso。

+1

您还拥有来自volley的NetworkImageView。很容易与 – peter

+0

@Laser一起使用,这个NetworkImageView对我来说是新的。谢谢! –

1

下面是一些你在Java中获得的引用在疲软的升序的

  1. 很强的借鉴意义 - 定期对象的引用
  2. 弱引用 - 在下一个GC生命周期
  3. 软引用GC版
  4. 幻影参考

所以,是的,会的。当你说的时候Android不清理,使用导航。AsyncTask继续运行,并在其内“参考”ImageView参考。我对WeakReference<T>的理解是,他们确保AsyncTask<T>在用户导航离开时不会保留ImageView引用。进一步阅读去等here