加载图片属于比较耗时的工作,我们需要异步进行加载,异步加载有两种方式: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. 2-11 tensorflow常量变量定义

    D:\Users\ZHONGZHENHUA\Anaconda3\envs\tensorflow\Lib\site-packages\tensorflow https://developer.nvidi ...

  2. c语言struct和c++的class的暧昧

    c语言风格的封装 数据放在一起,以引用和指针的方式传给行为c++ 认为封装不彻底 1数据和行为分开 对外提供接口 2没有权限设置 看看struct的一个例子 //data.h //c语言风格的封装 数 ...

  3. JS Promise API

    一.描述 我们知道JavaScript语言的执行环境是“单线程”,所谓单线程,就是一次只能够执行一个任务,如果有多个任务的话就要排队,前面一个任务完成后才可以继续下一个任务. 这种“单线程”的好处就是 ...

  4. Swift4 内存管理, 可选链, KeyPath

    创建: 2018/03/09 完成: 2018/03/09 参照型数据与ARC  ARC ● Swift里, 只有类实例与闭包实例是参照型 ● 生成时参照值为1, 被代入等每次+1, 减少每次-1 ● ...

  5. bzoj 3979: [WF2012]infiltration【瞎搞+随机化】

    参考:https://www.cnblogs.com/ccz181078/p/5622200.html 非常服气.jpg 就是random_shuffle几次然后顺着找,ans取min... #inc ...

  6. bzoj 3944: Sum【莫比乌斯函数+欧拉函数+杜教筛】

    一道杜教筛的板子题. 两个都是积性函数,所以做法是一样的.以mu为例,设\( f(n)=\sum_{d|n}\mu(d) g(n)=\sum_{i=1}^{n}f(i) s(n)=\sum_{i=1} ...

  7. [App Store Connect帮助]八、维护您的 App(2)将 App 从 App Store 中移除

    如果您不想继续向顾客提供您的 App,您可以将其从 App Store 中移除,这样会移除该 App 的所有版本.拥有该 App 先前版本的用户将无法更新 App,但只要您的合约有效,用户便仍可下载最 ...

  8. 多选下拉框(select 下拉多选)

    方法一:使用multiple-select.js和multiple-select .css实现 HTML代码: <select id='checkedLevel' style="wid ...

  9. gRPC入门

    一.gRPC简介 在介绍gRPC之前先说一下RPC(Remote Procedure Call),也叫远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.相比 ...

  10. 洛谷 P1540 机器翻译(队列)

    题目背景 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章. 题目描述 这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换.对于每个英文单词,软件会先 ...