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 }
第二步来分享我的异步任务线程下载图片并返回图片的过程,这个线程里最基本的方法就是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 }
最后一步就是主线程获得消息并更新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 };