zoukankan      html  css  js  c++  java
  • Android异步下载网络图片

    最近新做的一个项目,里面需要下载网络上的图片,并显示在UI界面上,学Android有个常识,就是Android中在主线程中没法直接更新UI的,要想更新UI必须另外开启一个线程来实现,当开启的线程完成图片下载的任务后,来去通知主线程去更新UI,当然这就涉及到Handler这个机制,嗯,背景大致就是这样。来简单的理一下思路:

    1.主线程中启动一个异步线程AsyncTask来下载图片,一般耗时操作或与网络交互的都要在异步线程中执行。

    2.图片下载完成后,来去通知主线程去更新UI。

    3.主线程收到消息后更新UI,完成图片的显示。

    涉及到基本的知识点有:

    1.HTTP访问网络的方式之一:HttpURLConnection,通过URL来创建URL对象,返回URLConnection对象,设置连接超时请求方式等一系列操作,具体可参考

    http://blog.sina.com.cn/s/blog_87216a0001014sm7.html

    2.AsyncTask异步任务:具体用法可参考资料http://blog.csdn.net/liuhe688/article/details/6532519

    3.Handler机制:处理子线程更新UI线程控件问题,参考资料http://www.open-open.com/lib/view/open1338942421672.html

    好,那么下面第一步就是在主线程中启动一个异步线程:

    1 @Override
    2 protected void initEvents() {
    3      new DownLoadImage().execute();
    4 }
    initEvents

    第二步来分享我的异步任务线程下载图片并返回图片的过程,这个线程里最基本的方法就是returnBitmap()这个方法,

    通过访问网络下载图片后返回图片。

    接下来就是在AsyncTask的doInBackground方法中获得下载好的图片,并通知主线程来去更新UI,参考代码如下:

     1 public class DownLoadImage extends AsyncTask<String, Void, String> {
     2 
     3         @Override 
     4         protected String doInBackground(String... params) { 
     5             bitmap= returnBitmap(PictureURL); 
     6                handler.sendEmptyMessage(1); 
     7             return null; 
     8         }
     9 
    10         private Bitmap returnBitmap(String pictureURL) { 
    11             URL myFileUrl=null; 
    12             Bitmap bitmap=null; 
    13             try { 
    14                 myFileUrl=new URL(pictureURL); 
    15             } catch (MalformedURLException e) { 
    16                 e.printStackTrace(); 
    17             } 
    18             HttpURLConnection connection; 
    19             try { 
    20                 connection = (HttpURLConnection) myFileUrl.openConnection(); 
    21                 connection.setDoInput(true); 
    22                 connection.connect(); 
    23                 InputStream iStream; 
    24                 iStream = connection.getInputStream(); 
    25                 bitmap=BitmapFactory.decodeStream(iStream); 
    26                 iStream.close(); 
    27             } catch (IOException e) { 
    28                 e.printStackTrace(); 
    29             } 
    30             return bitmap; 
    31         } 
    32     }
    DownLoadImage

    最后一步就是主线程获得消息并更新UI,通过Handler这个机制来完成,参考代码如下:

     1 public Handler handler=new Handler() 
     2     { 
     3         public void handleMessage(android.os.Message msg) 
     4         { 
     5             switch (msg.what) { 
     6             case 1: 
     7                picUrl.setImageBitmap(bitmap); 
     8                 break;
     9 
    10             default: 
    11                 break; 
    12             } 
    13         }; 
    14     };
    handler
  • 相关阅读:
    Java自学
    Java自学
    Java自学
    java自学
    Java自学
    mybatis基础及原理
    自定义swagger maven codegen插件
    spring学习总结016 --- spring事务原理
    spring学习总结015 --- spring事务
    windows解决端口占用问题
  • 原文地址:https://www.cnblogs.com/wucaiyun1/p/4837685.html
Copyright © 2011-2022 走看看