原文地址:

http://bbs.chinaunix.net/thread-1926876-1-1.html


在某些时候我们需要在Android设备上下载远端服务器上的图片来进行显示,这里我整理出两种比较好的方法来实现远程图片的下载。  方法一、直接通过Android官方提供的Http类访来问远程服务器,这里AndroidHttpClient是SDK 2.2中新出的方法,API Level为8,大家需要注意下,静态访问可以直接调用,如果SDK版本较低可以考虑Apache的Http库,当然HttpURLConnection或URLConnection也可以。static Bitmap downloadBitmapByCwj(String url) {     final AndroidHttpClient client = AndroidHttpClient.newInstance("linux初学三月");     final HttpGet getRequest = new HttpGet(url);     try {         HttpResponse response = client.execute(getRequest);         final int statusCode = response.getStatusLine().getStatusCode();         if (statusCode != HttpStatus.SC_OK) {              Log.e("cwjDebug", "Error " + statusCode + " while retrieving bitmap from " + url);              return null;         }                  final HttpEntity entity = response.getEntity();         if (entity != null) {             InputStream inputStream = null;             try {                 inputStream = entity.getContent();                  final Bitmap bitmap = BitmapFactory.decodeStream(inputStream);                 return bitmap;             } finally {                 if (inputStream != null) {                     inputStream.close();                   }                 entity.consumeContent();             }         }     } catch (Exception e) {           getRequest.abort();         Log.e("Debug", "Error while retrieving bitmap from " + url, e.toString());     } finally {         if (client != null) {             client.close();         }     }     return null; }复制代码这里提醒大家,BitmapFactory类的decodeStream方法在网络超时或较慢的时候无法获取完整的数据,这里我们通过继承FilterInputStream类的skip方法来强制实现flush流中的数据,主要原理就是检查是否到文件末端,告诉http类是否继续。static class FlushedInputStream extends FilterInputStream {     public FlushedInputStream(InputStream inputStream) {         super(inputStream);     }     @Override     public long skip(long n) throws IOException {         long totalBytesSkipped = 0L;         while (totalBytesSkipped < n) {             long bytesSkipped = in.skip(n - totalBytesSkipped);             if (bytesSkipped == 0L) {                   int byte = read();                   if (byte < 0) {                       break;  // we reached EOF                   } else {                       bytesSkipped = 1; // we read one byte                   }            }             totalBytesSkipped += bytesSkipped;         }         return totalBytesSkipped;     } }复制代码方法二、通过AsyncTask的异步任务  从Android 1.5固件开发平台开始Google提供了一个AsyncTask类来帮助开发者处理异步下载的实现,相对于Thread线程而言他可以运行在UI线程中,其内部的实现是从Java 5开始的并发包concurrent中派生而来的,总体实现比较可靠就是资源占用略大了些。不过使用起来比简单。这里下载图片类ImageDownloader类的download方法可以很好的处理实现UI显示等操作,参数一url为远程server上文件的url,第二个参数为imageview对象,可以直接让imageview显示出下载的远程图片。public class ImageDownloader {     public void download(String url, ImageView imageView) {             BitmapDownloaderTask task = new BitmapDownloaderTask(imageView);             task.execute(url);         }     } }复制代码有关具体的AsyncTask类实现,考虑到图片可能较大,为了给JVM充分的空间存储,这里推荐大家使用弱引用来保存ImageView对象。class BitmapDownloaderTask extends AsyncTask<String, Void, Bitmap> {     private String url;     private final WeakReference<ImageView> imageViewReference;  //使用WeakReference解决内存问题    public BitmapDownloaderTask(ImageView imageView) {         imageViewReference = new WeakReference<ImageView>(imageView);     }   @Override     protected Bitmap doInBackground(String... params) {   //实际的下载线程,内部其实是concurrent线程,所以不会阻塞            return downloadBitmap(params[0]);     }     @Override      protected void onPostExecute(Bitmap bitmap) {   //下载完后执行的        if (isCancelled()) {             bitmap = null;         }         if (imageViewReference != null) {             ImageView imageView = imageViewReference.get();             if (imageView != null) {                 imageView.setImageBitmap(bitmap);  //下载完设置imageview为刚才下载的bitmap对象            }         }     } }




更多相关文章

  1. Android通过Alpha实现渐变效果的几个方法
  2. [android 多线程]一些帖子与文章ProgressDialog, AsyncTask, Thr
  3. Android中AVD(Android Virtual Device)不能启动的处理方法
  4. Android多个Activity切换时其生命周期中的方法执行顺序
  5. Android大图片内存清理
  6. Android 如何在关于手机界面添加个图片
  7. Android中进程与进程、线程与线程之间如何通信?
  8. 两种android app调用jar的方法
  9. Android的性能优化方法

随机推荐

  1. 物流查询API在电商行业中最常见的2个用途
  2. 技术人员如何利用电商API实现增长?这是它
  3. php灭绝手把手亲传数组索引重建
  4. php 常用基础
  5. 将数组中的值取出并重新排序
  6. 数组下标重新归序
  7. PHP注册验证判断
  8. PHP模拟用户登陆验证
  9. 使用frp实现内网穿透
  10. 【前端 · 面试 】HTTP 总结(十一)—— HTT