当前位置: 移动技术网 > IT编程>移动开发>Android > Android使用AsyncTask加载图片的操作流程

Android使用AsyncTask加载图片的操作流程

2019年07月31日  | 移动技术网IT编程  | 我要评论

小麦进城34集,奥菲尔之罪歌曲,非诚勿扰于冰

加载图片基本操作

一、创建asynctask子类

  • 将imageview的弱引用设置为成员变量,创建构造函数传入imageview对象。
  • 调用指定大小解析bitmap方法。
  • 因为是弱引用,所以必须判断引用是否被回收。如果异步任务完成前,用户离开activity或者设置发生改变,imageview也可能不存在。
class bitmapworkertask extends asynctask<integer, void, bitmap> {
  private final weakreference<imageview> imageviewreference;
  private int data = 0;
  public bitmapworkertask(imageview imageview) {
    // use a weakreference to ensure the imageview can be garbage collected
    imageviewreference = new weakreference<imageview>(imageview);
  }
  // decode image in background.
  @override
  protected bitmap doinbackground(integer... params) {
    data = params[0];
    return decodesampledbitmapfromresource(getresources(), data, 100, 100));
  }
  // once complete, see if imageview is still around and set bitmap.
  @override
  protected void onpostexecute(bitmap bitmap) {
    if (imageviewreference != null && bitmap != null) {
      final imageview imageview = imageviewreference.get();
      if (imageview != null) {
        imageview.setimagebitmap(bitmap);
      }
    }
  }
}

二、创建异步任务实例对象,开始执行

public void loadbitmap(int resid, imageview imageview) {
  bitmapworkertask task = new bitmapworkertask(imageview);
  task.execute(resid);
}

处理并发

因为listview和gridview复用子布局,无法保证异步任务完成时,相关的布局没有被回收。也无法保证异步任务完成时间的先后顺序。所以必须处理并发事件。

一、创建bitmapdrawable子类

该类专门用来保存bitmap及其对应的异步任务

static class asyncdrawable extends bitmapdrawable {
  private final weakreference<bitmapworkertask> bitmapworkertaskreference;
  public asyncdrawable(resources res, bitmap bitmap,
      bitmapworkertask bitmapworkertask) {
    super(res, bitmap);
    bitmapworkertaskreference =
      new weakreference<bitmapworkertask>(bitmapworkertask);
  }
  public bitmapworkertask getbitmapworkertask() {
    return bitmapworkertaskreference.get();
  }
}

二、绑定asyncdrawable

创建asyncdrawable并传入bitmapworkertask对象,imageview设置为该asyncdrawable再开始异步任务

public void loadbitmap(int resid, imageview imageview) {
  if (cancelpotentialwork(resid, imageview)) {
    final bitmapworkertask task = new bitmapworkertask(imageview);
    final asyncdrawable asyncdrawable =
        new asyncdrawable(getresources(), mplaceholderbitmap, task);
    imageview.setimagedrawable(asyncdrawable);
    task.execute(resid);
  }
}

cancelpotentialwork这个方法用于调用方法获取控件对应异步任务,判断是否与当前任务一致

public static boolean cancelpotentialwork(int data, imageview imageview) {
  final bitmapworkertask bitmapworkertask = getbitmapworkertask(imageview);
  if (bitmapworkertask != null) {
    final int bitmapdata = bitmapworkertask.data;
    // if bitmapdata is not yet set or it differs from the new data
    if (bitmapdata == 0 || bitmapdata != data) {
      // cancel previous task
      bitmapworkertask.cancel(true);
    } else {
      // the same work is already in progress
      return false;
    }
  }
  // no task associated with the imageview, or an existing task was cancelled
  return true;
}

这个getbitmapworkertask()方法用于获取图片对应异步任务

private static bitmapworkertask getbitmapworkertask(imageview imageview) {
  if (imageview != null) {
    final drawable drawable = imageview.getdrawable();
    if (drawable instanceof asyncdrawable) {
      final asyncdrawable asyncdrawable = (asyncdrawable) drawable;
      return asyncdrawable.getbitmapworkertask();
    }
  }
  return null;
}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对移动技术网的支持。如果你想了解更多相关内容请查看下面相关链接

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网