点击打开链接


在某些时候我们需要在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线程模型【Android】
  2. Android studio中正确引入so文件的方法
  3. 第一行代码-9.6 服务的最佳实践--后台执行的定时任务
  4. Android中图像变换Matrix的原理、代码验证和应用(三)
  5. Android代码混淆及项目发布方法记录
  6. android不将apk包编译到系统里的方法
  7. Android、iOS添加子视图方法比较

随机推荐

  1. android 传递自定义参数
  2. gradle切换为阿里云镜像
  3. HotApp小程序统计开发总结之设置了naviga
  4. Android(安卓)点击Notification事件处理
  5. Android(安卓)琐碎知识点汇总
  6. 【Android】ArrayList通过remove方法删除
  7. 使用Criteria确定android location provi
  8. Android(安卓)O media difference(add HID
  9. 编译android源码的过程
  10. Android标准调用播放器流程