加载图片属于比较耗时的工作,我们需要异步进行加载,异步加载有两种方式:1.通过AsyncTask类进行;2.通过Handler来实现,下面我们就来看一下如何通过这两种方式实现网络图片的异步加载。

一、AsyncTask方式

1.main.xml:
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent" >
  5. <ImageView
  6. android:id="@+id/img"
  7. android:layout_width="wrap_content"
  8. android:layout_height="wrap_content"
  9. android:layout_centerInParent="true" />
  10. </RelativeLayout>

2.MainActivity.java:

  1. package com.example.imageloaderdemo;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.net.HttpURLConnection;
  5. import java.net.MalformedURLException;
  6. import java.net.ProtocolException;
  7. import java.net.URL;
  8. import android.app.Activity;
  9. import android.graphics.Bitmap;
  10. import android.graphics.BitmapFactory;
  11. import android.os.AsyncTask;
  12. import android.os.Bundle;
  13. import android.view.View;
  14. import android.view.View.OnClickListener;
  15. import android.widget.Button;
  16. import android.widget.ImageView;
  17. public class MainActivity extends Activity {
  18. private ImageView mImageView;
  19. private static String URLSTRING;
  20. @Override
  21. protected void onCreate(Bundle savedInstanceState) {
  22. super.onCreate(savedInstanceState);
  23. setContentView(R.layout.activity_main);
  24. mImageView = (ImageView) findViewById(R.id.img);
  25. URLSTRING="http://photocdn.sohu.com/20110927/Img320705637.jpg";//图片地址
  26. MyAsyncTask myAsyncTask=new MyAsyncTask();
  27. myAsyncTask.execute(URLSTRING);
  28. }
  29. class MyAsyncTask extends AsyncTask<String, Void, Bitmap> {
  30. @Override
  31. protected void onPostExecute(Bitmap result) {
  32. super.onPostExecute(result);
  33. mImageView.setImageBitmap(result);
  34. }
  35. @Override
  36. protected Bitmap doInBackground(String... params) {
  37. Bitmap bitmap=null;
  38. try {
  39. URL url=new URL(params[0]);
  40. HttpURLConnection connection=(HttpURLConnection) url.openConnection();
  41. connection.setRequestMethod("GET");
  42. connection.setConnectTimeout(5000);
  43. if(connection.getResponseCode()==200){
  44. InputStream inputStream=connection.getInputStream();
  45. bitmap=BitmapFactory.decodeStream(inputStream);
  46. }
  47. } catch (MalformedURLException e) {
  48. e.printStackTrace();
  49. } catch (ProtocolException e) {
  50. e.printStackTrace();
  51. } catch (IOException e) {
  52. e.printStackTrace();
  53. }
  54. return bitmap;
  55. }
  56. }
  57. }

3.总结:

1.AsyncTask<String, Void, Bitmap>//三个参数,第一个为传入的URL,第二个表示中间状态的,这里传入空即可,第三个为返回值
2.doInBackground(String... params)方法新开了一个线程,AysncTask其他几个方法都在主线程中运行
3.除了doInBackground方法,其他方法都在主线程中运行,所以这里:

  1. mImageView.setImageBitmap(result);可以直接设置
 
运行实例如下:
 
成功的加载了网络图片。
 

二、Handler方式

异步请求Bitmap,因为子线程无法更新主线程UI,所以必须通过Handler的方式进行图片渲染。
 
布局文件不变,下面我们看一下MainActivity.java:
 
  1. package com.example.imageloaderdemo;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.net.HttpURLConnection;
  5. import java.net.MalformedURLException;
  6. import java.net.ProtocolException;
  7. import java.net.URL;
  8. import android.app.Activity;
  9. import android.graphics.Bitmap;
  10. import android.graphics.BitmapFactory;
  11. import android.os.Bundle;
  12. import android.os.Handler;
  13. import android.os.Message;
  14. import android.widget.ImageView;
  15. public class MainActivity extends Activity {
  16. private ImageView mImageView;
  17. private static String URLSTRING;
  18. private Handler handler = new Handler() {
  19. public void handleMessage(Message msg) {
  20. Bitmap bitmap = (Bitmap) msg.obj;
  21. mImageView.setImageBitmap(bitmap);
  22. };
  23. };
  24. @Override
  25. protected void onCreate(Bundle savedInstanceState) {
  26. super.onCreate(savedInstanceState);
  27. setContentView(R.layout.activity_main);
  28. mImageView = (ImageView) findViewById(R.id.img);
  29. URLSTRING = "http://photocdn.sohu.com/20110927/Img320705637.jpg";// 图片地址
  30. MyThread myThread = new MyThread();
  31. myThread.start();// 调用线程
  32. }
  33. class MyThread extends Thread {
  34. @Override
  35. public void run() {
  36. super.run();
  37. Bitmap bitmap = null;
  38. try {
  39. URL url = new URL(URLSTRING);
  40. HttpURLConnection connection = (HttpURLConnection) url
  41. .openConnection();
  42. connection.setRequestMethod("GET");
  43. connection.setConnectTimeout(5000);
  44. if (connection.getResponseCode() == 200) {
  45. InputStream inputStream = connection.getInputStream();
  46. bitmap = BitmapFactory.decodeStream(inputStream);
  47. Message message = new Message();
  48. message.obj = bitmap;
  49. handler.sendMessage(message);
  50. }
  51. } catch (MalformedURLException e) {
  52. e.printStackTrace();
  53. } catch (ProtocolException e) {
  54. e.printStackTrace();
  55. } catch (IOException e) {
  56. e.printStackTrace();
  57. }
  58. }
  59. }
  60. }

总结:

1.新开一个线程用于网络数据的请求:

  1. class MyThread extends Thread{}
2.通过sendMessage发送对象,通过handleMessage处理数据。
 
很简单啊,希望可以帮到初学者。
 
喜欢的朋友关注我!谢谢

Android实战简易教程-第四十九枪(两种方式实现网络图片异步加载)的更多相关文章

  1. Android实战简易教程-第三十九枪(第三方短信验证平台Mob和验证码自己主动填入功能结合实例)

    用户注冊或者找回password时通常会用到短信验证功能.这里我们使用第三方的短信平台进行验证实例. 我们用到第三方短信验证平台是Mob,地址为:http://mob.com/ 一.注冊用户.获取SD ...

  2. Android实战简易教程-第四十五枪(SlideSwitch-好看又有用的开关button)

    开关button也是在项目中经经常使用到的控件,github上有开源的项目,我们研究下它的用法: 1.SlideButton.java: /* * Copyright (C) 2015 Quinn C ...

  3. Android实战简易教程-第四十枪(窃听风云之短信监听)

    近期在做监听验证码短信自己主动填入的功能,无意间想到了一个短信监听的办法. 免责声明:短信监听本身是一种违法行为,这里仅仅是技术描写叙述.请大家学习技术就可以.(哈哈) 本实例是基于bmob提供的后台 ...

  4. Android实战简易教程-第六十六枪(server端搭建和server端Json数据交互)

    学习Android有一段时间了.对server端有非常深的好奇,决定对server端的实现进行一些研究,这里实现了一个简单的小样例,用于获取server端的json数据,样例非常easy,适合刚開始学 ...

  5. Android实战简易教程-第三十四枪(基于ViewPager和FragmentPagerAdapter实现滑动通用Tab)

    上一段时间写过一篇文章<基于ViewPager实现微信页面切换效果> 里面实现了相似微信Tab的页面.可是这样的实现方法有个问题.就是以后全部的代码逻辑都必须在MainActivity中实 ...

  6. Android开发之使用sqlite3工具操作数据库的两种方式

    使用 sqlite3 工具操作数据库的两种方式 请尊重他人的劳动成果,转载请注明出处:Android开发之使用sqlite3工具操作数据库的两种方式 http://blog.csdn.net/feng ...

  7. Android实战简易教程-第二十八枪(Uri转String型实例)

    接上一篇文章.我们能够轻易的获取所选图片的uri,那么我们考虑怎样将获取的uri转换成String型的地址呢? 接下来我们通过实例来研究.布局文件和上篇(二十七枪)一致,我们就不再列出,直接看Main ...

  8. Android实战简易教程-第十三枪(五大布局研究)

    我们知道Android系统应用程序通常是由多个Activity组成,而这些Activity以视图的形式展如今我们面前, 视图都是由一个一个的组件构成的. 组件就是我们常见的Button.TextEdi ...

  9. Android简易实战教程--第四十九话《满屏拖动的控件》

    今天做个有意思的效果吧,控件的拖拽,简单实用,逻辑清晰点3分钟看完. 说的很高大上,其实就是拖动Button按钮跟着鼠标位置满手机屏幕跑罢了. 直接上简单的代码吧: public class Main ...

随机推荐

  1. box-shadow 模拟border

    border会占据空间;如果想加边框效果,但是又不占用空间,可以使用box-shadow来模拟 demo div 100*100 border:10px solid red; 可以写: div 100 ...

  2. Mysql操作符号

    1.比较运算符:  =  相等  <> 不等于 != 这个也可以  >  大于  <  小于  >= 大于等于  <= 小于等于 2.逻辑运算符:  is null ...

  3. js方式的页面跳转

    window.location.href="login.html";   (直接function里面执行 跳转)

  4. bzoj 1863: [Zjoi2006]trouble 皇帝的烦恼【二分+dp】

    二分答案,注意l是max(a[i]+a[i+1]),r是sum_a 判断的时候用dp,设f[i]为i与1最少的相同颜色数,g[i]为i与1最多的相同颜色数,转移是f[i]=max(a[i]-(w-a[ ...

  5. poj 1815 Friendship【最小割】

    网络流的题总是出各种奇怪的错啊--没写过邻接表版的dinic,然后bfs扫到t点不直接return 1就会TTTTTLE-- 题目中的操作是"去掉人",很容易想到拆点,套路一般是( ...

  6. 实现自己的ArrayList

    最近在学习数据结构和算法,书上有个ArrayList的简单实现,写的很不错. package cn.sp.test4; import java.util.Iterator; import java.u ...

  7. django中实现websocket

    一.Websockets介绍 随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了.近年来,随着HTML5的诞生,WebSocket协议被提出,它实现了浏览器与服务器的全双工通信 ...

  8. Service官方教程(8)Bound Service示例之2-跨进程使用Messenger

    Compared to AIDL When you need to perform IPC, using a Messenger for your interface is simpler than ...

  9. 173 Binary Search Tree Iterator 二叉搜索树迭代器

    实现一个二叉搜索树迭代器.你将使用二叉搜索树的根节点初始化迭代器.调用 next() 将返回二叉搜索树中的下一个最小的数.注意: next() 和hasNext() 操作的时间复杂度是O(1),并使用 ...

  10. Hadoop集群搭建及MapReduce应用

    一.Hadoop集群的搭建与配置 1.节点准备 集群规划: 主机名 IP 安装的软件 运行的进程 weekend 01 192.168.1.60 jdk.hadoop NameNode.DFSZKFa ...