小麦进城34集,奥菲尔之罪歌曲,非诚勿扰于冰
加载图片基本操作
一、创建asynctask子类
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; }
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对移动技术网的支持。如果你想了解更多相关内容请查看下面相关链接
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
Android studio开发小型对话机器人app(实例代码)
Android通过Java sdk的方式接入OpenCv的方法
Android 通过cmake的方式接入opencv的方法步骤
Android Studio finish()方法的使用与解决app点击“返回”(直接退出)
Android 进度条 ProgressBar的实现代码(隐藏、出现、加载进度)
网友评论