Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/183.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android异步任务中的WeakReference与强引用_Java_Android_Android Asynctask_Weak References - Fatal编程技术网

Java Android异步任务中的WeakReference与强引用

Java Android异步任务中的WeakReference与强引用,java,android,android-asynctask,weak-references,Java,Android,Android Asynctask,Weak References,我正在实现一个列表视图,以显示DCIM/Camera文件夹下的图像列表。我正在异步加载列表视图上的图像缩略图,并在异步任务实现中使用ImageView的强引用,即ThumbnailReaderTask,此异步任务负责加载图像缩略图。有人建议我使用ImageView的WeakReference。我只是好奇,在这个特定场景中使用WeakReference会有什么好处 java文档建议 假设垃圾收集器在某个时间点确定某个对象是弱可访问的。届时,它将自动清除对该对象的所有弱引用,以及对任何其他弱可及对象

我正在实现一个列表视图,以显示DCIM/Camera文件夹下的图像列表。我正在异步加载列表视图上的图像缩略图,并在异步任务实现中使用ImageView的强引用,即ThumbnailReaderTask,此异步任务负责加载图像缩略图。有人建议我使用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;
    }
}
公共类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中获得的一些参考资料,它们是按弱点的升序排列的

  • 强引用-常规对象引用
  • 弱引用-GC在下一个GC生命周期中被删除
  • 软参考
  • 幻象参考

  • 所以,是的。当你说,使用导航离开后,Android不会清理。
    AsyncTask
    保持运行,并且在其内部“存在”了
    ImageView
    引用。我对
    WeakReference
    s的理解是,它们确保
    AsyncTask
    在用户离开时不会保留
    ImageView
    引用。继续阅读等

    您还可以通过截击查看NetworkImageView。很容易操作with@Laser,此NetworkImageView对我来说是新的。谢谢你!