很多时候我们需要在Android设备上下载远程服务器上的图片进行显示,今天Android123整理出两种比较好的方法来实现远程图片的下载。
  方法一、直接通过Android提供的Http类访问远程服务器,这里AndroidHttpClient是SDK 2.2中新出的方法,API Level为8,大家需要注意下,静态访问可以直接调用,如果SDK版本较低可以考虑Apache的Http库,当然HttpURLConnection或URLConnection也可以。

 
 static Bitmap downloadBitmapByCwj(String url) {     final AndroidHttpClient client = AndroidHttpClient.newInstance("Android123");     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("android123Debug", "Error while retrieving bitmap from " + url, e.toString());     } finally {         if (client != null) {             client.close();         }     }     return null; } 

  这里Android开发网提醒大家,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充分的空间存储,这里Android123推荐大家使用弱引用来保存ImageView对象。

class BitmapDownloaderTask extends AsyncTask {     private String url;     private final WeakReference imageViewReference;  //使用WeakReference解决内存问题     public BitmapDownloaderTask(ImageView imageView) {         imageViewReference = new WeakReference(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. 几个应用开源项目
  2. OpenCV自学笔记31. Android(安卓)上使用jni和opencv 实现边缘检
  3. androidstudio使用kotlin开发APP
  4. android代码审查工具---lint工具的使用
  5. Android(1.1-4.2) platform 开发包【全版本】
  6. Android(安卓)轻松实现语音朗读
  7. Android中VideoView及SurfaceView视频播放实现
  8. android commend build.xml
  9. 浅谈Java中Collections.sort对List排序的两种方法

随机推荐

  1. Android(安卓)Bundle类
  2. 2010.12.27——— android service
  3. Android(安卓)Studio报Could not GET xxx
  4. android 关于Make sure the plugin is pr
  5. Android(安卓)Loaders
  6. Android如何调用Google Web Search?
  7. Android(安卓)常用代码大集合
  8. ArcGIS for Android(安卓)10.2.5
  9. 关于Android(安卓)ListView组件中android
  10. Android:通过WifiManager监听Wifi信号强