android ImageView 异步下载显示图片

在大多数的网络应用程序开发中,都需要从网络中下载图片,并显示图片,如QQ列表头像、微博列表头像等,第一种方法是将列表中的所有图片下载下来在显示,这种方法虽然可行,但在网络环境很差的情况下,下载时间比较长,应用程序容易出现ANR。第二种方式是,在列表显示的时候,每个列表项的头像图片采用异步下载,在头像下载完毕之前,显示默认图片,下载完成后,显示下载的图片头像。

实现该功能的代码如下,定义一个RemoteImageView类继承ImageView,如果下载失败3次,取消下载,使用默认图片显示:

  1. public class RemoteImageView extends ImageView {  
  2.       
  3.     public RemoteImageView(Context context, AttributeSet attrs, int defStyle) {  
  4.         super(context, attrs, defStyle);  
  5.         // TODO Auto-generated constructor stub  
  6.     }  
  7.   
  8.     public RemoteImageView(Context context, AttributeSet attrs) {  
  9.         super(context, attrs);  
  10.         // TODO Auto-generated constructor stub  
  11.     }  
  12.   
  13.     public RemoteImageView(Context context) {  
  14.         super(context);  
  15.         // TODO Auto-generated constructor stub  
  16.     }  
  17.   
  18.     private static int MAX_FAILURES = 3;  
  19.     private String m_url;  
  20.     private int mFailure;  
  21.     private Integer defaultImage;  
  22.       
  23.     public void setDefaultImage(Integer resId) {  
  24.         this.defaultImage = resId;  
  25.     }  
  26.       
  27.     public void setImage(String url){  
  28.         if (url == null || url.equals("")) {  
  29.             if (defaultImage != null) {  
  30.                 setImageResource(defaultImage);  
  31.             }  
  32.             return;  
  33.         }  
  34.         if (m_url!= null && m_url.equals(url)) {  
  35.             mFailure++;  
  36.             if (mFailure > MAX_FAILURES) {  
  37.                 return;  
  38.             }  
  39.         }else {  
  40.             m_url = url;  
  41.             mFailure = 0;  
  42.         }  
  43.           
  44.         if (Manager.getInstance().getImageCache().isCached(url)) {  
  45.             setImageBitmap(Manager.getInstance().getImageCache().get(url));  
  46.         }else {  
  47.             new DownLoadImageTask().execute(url);  
  48.         }  
  49.     }  
  50.       
  51.     /** 
  52.      *  
  53.      * 
  54.      * RemoteImageView.java Create on 2012-8-8 上午11:22:53 
  55.      *    
  56.      *   
  57.      * Params 启动任务执行的输入参数  
  58.      * Progress 后台任务执行的百分比 
  59.      * Result 后台执行任务最终返回的结果 
  60.      * @author wen.yang 
  61.      */  
  62.     public class DownLoadImageTask extends AsyncTask<String, Integer, String>{  
  63.         private static final String TAG = "DownLoadImageTask";  
  64.         private InputStream inputStream= null;  
  65.           
  66.         /** 
  67.          * onPreExecute(), 该方法将在执行实际的后台操作前被UI 线程调用。 
  68.          * 可以在该方法中做一些准备工作,如在界面上显示一个进度条,或者一些控件的实例化 
  69.          */  
  70.         @Override  
  71.         protected void onPreExecute() {  
  72.             // TODO Auto-generated method stub  
  73.             if (defaultImage != null) {  
  74.                 setImageResource(defaultImage);  
  75.             }  
  76.         }  
  77.   
  78.         /** 
  79.          * 在doInBackground 执行完成后,onPostExecute 方法将被UI 线程调用, 
  80.          * 后台的计算结果将通过该方法传递到UI 线程,并且在界面上展示给用户 
  81.          */  
  82.         @Override  
  83.         protected void onPostExecute(String result) {  
  84.             // TODO Auto-generated method stub  
  85.             if (!result.equals(m_url)) {  
  86.                 return;  
  87.             }  
  88.             Bitmap bmp = Manager.getInstance().getImageCache().get(result);  
  89.             if (bmp != null) {  
  90.                 RemoteImageView.this.setImageBitmap(bmp);  
  91.             }else {  
  92.                 RemoteImageView.this.setImage(result);  
  93.             }  
  94.         }  
  95.   
  96.         /** 
  97.          * 将在onPreExecute 方法执行后马上执行,该方法运行在后台线程中。这里将主要 
  98.          * 负责执行那些很耗时的后台处理工作 
  99.          */  
  100.         @Override  
  101.         protected String doInBackground(String... params) {  
  102.             String taskUrl = null;  
  103.             try {  
  104.                 taskUrl = params[0];  
  105.                   
  106.                 BitmapFactory.Options opts = new BitmapFactory.Options();  
  107.                 //opts.inJustDecodeBounds = true;  
  108.                 //opts.inSampleSize = ImageHelper.computeSampleSize(opts, -1, 128*128);  
  109.                 //opts.inJustDecodeBounds = false;  
  110.                 opts.inInputShareable = true;  
  111.                 opts.inPurgeable = true;  //图片可以被回收  
  112.                 opts.inPreferredConfig = Bitmap.Config.ALPHA_8;  
  113.                 long fileSize = HttpDownLoad.getFileSize(taskUrl);  
  114.                   
  115.                 if (fileSize < 20480) {   //0-20k  
  116.                     opts.inSampleSize =1;  
  117.                 }else if (fileSize < 51200) { //20-50k  
  118.                     opts.inSampleSize =2;  
  119.                 }else if (fileSize < 307200) { //50-300k  
  120.                     opts.inSampleSize =6;  
  121.                 }else if (fileSize < 819200) { //300-800k  
  122.                     opts.inSampleSize =8;  
  123.                 }else if (fileSize < 1048576) { //800-1024k  
  124.                     opts.inSampleSize =10;  
  125.                 }else {  
  126.                     opts.inSampleSize =14;  
  127.                 }  
  128.                 inputStream = new URL(taskUrl).openStream();  
  129.                 Bitmap bmp =null;  
  130.                 bmp = BitmapFactory.decodeStream(inputStream, null, opts);  
  131.                   
  132.                 if (bmp != null) {  
  133.                     Manager.getInstance().getImageCache().put(taskUrl, bmp);  
  134.                 }  
  135.             } catch (Exception e) {  
  136.                 Log.e(TAG, "DownLoadImageTask---->doInBackground:"+e.getMessage());  
  137.             }finally{  
  138.                 try {  
  139.                     if (inputStream != null) {  
  140.                         inputStream.close();  
  141.                     }  
  142.                 } catch (IOException e) {  
  143.                     Log.e(TAG, "DownLoadImageTask---->doInBackground:"+e.getMessage());  
  144.                 }  
  145.             }  
  146.             return taskUrl;  
  147.         }   
  148.     }  
  149. }  

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值