Android使用AsyncTask加载图片的操作流程
加载图片基本操作
一、创建AsyncTask子类
- 将ImageView的弱引用设置为成员变量,创建构造函数传入ImageView对象。
- 调用指定大小解析Bitmap方法。
- 因为是弱引用,所以必须判断引用是否被回收。如果异步任务完成前,用户离开Activity或者设置发生改变,ImageView也可能不存在。
classBitmapWorkerTaskextendsAsyncTask{ privatefinalWeakReference imageViewReference; privateintdata=0; publicBitmapWorkerTask(ImageViewimageView){ //UseaWeakReferencetoensuretheImageViewcanbegarbagecollected imageViewReference=newWeakReference (imageView); } //Decodeimageinbackground. @Override protectedBitmapdoInBackground(Integer...params){ data=params[0]; returndecodeSampledBitmapFromResource(getResources(),data,100,100)); } //Oncecomplete,seeifImageViewisstillaroundandsetbitmap. @Override protectedvoidonPostExecute(Bitmapbitmap){ if(imageViewReference!=null&&bitmap!=null){ finalImageViewimageView=imageViewReference.get(); if(imageView!=null){ imageView.setImageBitmap(bitmap); } } } }
二、创建异步任务实例对象,开始执行
publicvoidloadBitmap(intresId,ImageViewimageView){ BitmapWorkerTasktask=newBitmapWorkerTask(imageView); task.execute(resId); }
处理并发
因为ListView和GridView复用子布局,无法保证异步任务完成时,相关的布局没有被回收。也无法保证异步任务完成时间的先后顺序。所以必须处理并发事件。
一、创建BitmapDrawable子类
该类专门用来保存Bitmap及其对应的异步任务
staticclassAsyncDrawableextendsBitmapDrawable{ privatefinalWeakReferencebitmapWorkerTaskReference; publicAsyncDrawable(Resourcesres,Bitmapbitmap, BitmapWorkerTaskbitmapWorkerTask){ super(res,bitmap); bitmapWorkerTaskReference= newWeakReference (bitmapWorkerTask); } publicBitmapWorkerTaskgetBitmapWorkerTask(){ returnbitmapWorkerTaskReference.get(); } }
二、绑定AsyncDrawable
创建AsyncDrawable并传入BitmapWorkerTask对象,imageView设置为该AsyncDrawable再开始异步任务
publicvoidloadBitmap(intresId,ImageViewimageView){ if(cancelPotentialWork(resId,imageView)){ finalBitmapWorkerTasktask=newBitmapWorkerTask(imageView); finalAsyncDrawableasyncDrawable= newAsyncDrawable(getResources(),mPlaceHolderBitmap,task); imageView.setImageDrawable(asyncDrawable); task.execute(resId); } }
cancelPotentialWork这个方法用于调用方法获取控件对应异步任务,判断是否与当前任务一致
publicstaticbooleancancelPotentialWork(intdata,ImageViewimageView){ finalBitmapWorkerTaskbitmapWorkerTask=getBitmapWorkerTask(imageView); if(bitmapWorkerTask!=null){ finalintbitmapData=bitmapWorkerTask.data; //IfbitmapDataisnotyetsetoritdiffersfromthenewdata if(bitmapData==0||bitmapData!=data){ //Cancelprevioustask bitmapWorkerTask.cancel(true); }else{ //Thesameworkisalreadyinprogress returnfalse; } } //NotaskassociatedwiththeImageView,oranexistingtaskwascancelled returntrue; }
这个getBitmapWorkerTask()方法用于获取图片对应异步任务
privatestaticBitmapWorkerTaskgetBitmapWorkerTask(ImageViewimageView){ if(imageView!=null){ finalDrawabledrawable=imageView.getDrawable(); if(drawableinstanceofAsyncDrawable){ finalAsyncDrawableasyncDrawable=(AsyncDrawable)drawable; returnasyncDrawable.getBitmapWorkerTask(); } } returnnull; }
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。如果你想了解更多相关内容请查看下面相关链接
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。