Java Android异步任务中的WeakReference与强引用
我正在实现一个列表视图,以显示DCIM/Camera文件夹下的图像列表。我正在异步加载列表视图上的图像缩略图,并在异步任务实现中使用ImageView的强引用,即ThumbnailReaderTask,此异步任务负责加载图像缩略图。有人建议我使用ImageView的WeakReference。我只是好奇,在这个特定场景中使用WeakReference会有什么好处 java文档建议 假设垃圾收集器在某个时间点确定某个对象是弱可访问的。届时,它将自动清除对该对象的所有弱引用,以及对任何其他弱可及对象的所有弱引用,通过强引用和软引用链可以从这些弱可及对象中获得该对象 这是我的代码(为了简单起见,我只是在分享ListView和ThumbnailReaderTask的适配器实现) ImageListEntryJava Android异步任务中的WeakReference与强引用,java,android,android-asynctask,weak-references,Java,Android,Android Asynctask,Weak References,我正在实现一个列表视图,以显示DCIM/Camera文件夹下的图像列表。我正在异步加载列表视图上的图像缩略图,并在异步任务实现中使用ImageView的强引用,即ThumbnailReaderTask,此异步任务负责加载图像缩略图。有人建议我使用ImageView的WeakReference。我只是好奇,在这个特定场景中使用WeakReference会有什么好处 java文档建议 假设垃圾收集器在某个时间点确定某个对象是弱可访问的。届时,它将自动清除对该对象的所有弱引用,以及对任何其他弱可及对象
//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;
}
}
公共类ImageListAdapter扩展了BaseAdapter{
活动语境;
列出m_图像;
公共ImageListAdapter(活动上下文,列表图像){
this.m_context=上下文;
此.m_images=图像;
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
@凌驾
公共对象getItem(int位置){
返回m_图像。获取(位置);
}
@凌驾
public int getCount(){
返回m_images.size();
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
ImageListEntry currentImage=m_images.get(位置);
TextView名称TextView=(TextView)convertView.findViewById(R.id.explorer\u resName);
nameTextView.setText(“设置一些文本…”);
ImageView thumbnailImageView=(ImageView)convertView.findViewById(R.id.explorer\u resIcon);
//异步图像加载
新建ThumbnailReaderTask(thumbnailImageView).execute(currentImage.getFile());
返回视图;
}
}
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;
}
}
公共类ThumbnailReaderTask扩展异步任务{
//应使用WeakReference\u imageViewReference
私有最终ImageView m_ImageView;
公共ThumbnailReaderTask(ImageView ImageView){
m_imageView=imageView;
}
@凌驾
受保护位图doInBackground(文件…参数){
返回readBitmapFromFile(参数[0]);
}
@凌驾
受保护的void onPostExecute(位图){
ImageView ImageView=m_ImageView;//m_imageViewReference.get();
如果(imageView!=null){
if(位图!=null){
设置图像位图(位图);
}否则{
Drawable占位符=imageView.getContext().getResources().getDrawable(R.mipmap.filetype_image);
imageView.setImageDrawable(占位符);
}
}
}
私有位图readBitmapFromFile(文件文件){
//读取缩略图并返回;
}
}
这有助于清理为ImageView加载的缩略图位图吗
这是否有助于清理正在加载的缩略图位图
图像视图
对。弱引用将允许GC清除m_imageView
,并且在m_imageView
在某个点保持弱可达的情况下,可以从它访问的所有对象。例如,如果在您的AsyncTask
加载新位图时,保存m_imageView
的Activity
被销毁,则可能会发生这种情况
但是,我建议您不要走这条路,而是使用一个可用的库来异步加载图像。原因很简单:这是一项非琐碎且耗时的任务,您需要解决大量的bug。请查看UniversalImageLoader或毕加索。以下是您在Java中获得的一些参考资料,它们是按弱点的升序排列的
所以,是的。当你说,使用导航离开后,Android不会清理。
AsyncTask
保持运行,并且在其内部“存在”了ImageView
引用。我对WeakReference
s的理解是,它们确保AsyncTask
在用户离开时不会保留ImageView
引用。继续阅读等 您还可以通过截击查看NetworkImageView。很容易操作with@Laser,此NetworkImageView对我来说是新的。谢谢你!