zoukankan      html  css  js  c++  java
  • 转载 Android多线程下载远程图片

    很多时候我们需要在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<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对象
    }
    }
    }
    }
  • 相关阅读:
    SGU 495 Kids and Prizes 概率DP 或 数学推理
    poj 2799 IP Networks 模拟 位运算
    uva 202 Repeating Decimals 模拟
    poj 3158 Kickdown 字符串匹配?
    uva 1595 Symmetry 暴力
    uva 201 Squares 暴力
    uva 1594 Ducci Sequence 哈希
    uva 1368 DNA Consensus String 字符串
    数字、字符串、列表的常用操作
    if条件判断 流程控制
  • 原文地址:https://www.cnblogs.com/xiao0/p/2174454.html
Copyright © 2011-2022 走看看