【Android进阶】使用HttpURLConnection实现图片的下载与现显示

虽然我们在开发中经常使用别人已经开发好的开源框架,但是,了解这些框架底层的实现,能够让我们更好的理解功能的实现。

这篇文章主要介绍使用HttpURLConnection对象,实现图片文件的下载,以及显示。

我们的思路是,首先使用HttpURLConnection实现图片文件的下载,在下载结束之后,使用handler异步的显示图片。

因为功能比较简单,我只把代码贴在下面,注释很详细

/**
 * 使用HttpURLConnection实现图片的下载与现显示
 *
 * @author ZhaoKaiQiang
 * @time 2014年6月9日
 */
public class MainActivity extends Activity {

	private Context mContext;
	private ImageView image;
	// 加载成功
	private static final int LOAD_SUCCESS = 1;
	// 加载失败
	private static final int LOAD_ERROR = -1;
	// 用于异步的显示图片
	private Handler handler = new Handler() {
		public void handleMessage(Message msg) {

			switch (msg.what) {
			//下载成功
			case LOAD_SUCCESS:
				// 获取图片的文件对象
				File file = new File(Environment.getExternalStorageDirectory(), "pic.jpg");
				FileInputStream fis = null;
				try {
					fis = new FileInputStream(file);
					Bitmap bitmap = BitmapFactory.decodeStream(fis);
					image.setImageBitmap(bitmap);

				} catch (FileNotFoundException e) {
					e.printStackTrace();
				}

				break;
				//下载失败
			case LOAD_ERROR:

				Toast.makeText(mContext, "加载失败", 0).show();

				break;
			}

		};
	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		mContext = this;
		setContentView(R.layout.activity_main);
		image = (ImageView) findViewById(R.id.image);
	}

	// Button的点击事件
	public void show(View view) {
		// 开启新的线程用于下载图片
		new Thread(new Runnable() {
			public void run() {

				getPicture();
			}
		}).start();

	}

	//下载图片的主方法
	private void getPicture() {

		URL url = null;
		InputStream is = null;
		FileOutputStream fos = null;
		try {
			//构建图片的url地址
			url = new URL("http://avatar.csdn.net/C/6/8/1_bz419927089.jpg");
			//开启连接
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			//设置超时的时间,5000毫秒即5秒
			conn.setConnectTimeout(5000);
			//设置获取图片的方式为GET
			conn.setRequestMethod("GET");
			//响应码为200,则访问成功
			if (conn.getResponseCode() == 200) {
				//获取连接的输入流,这个输入流就是图片的输入流
				is = conn.getInputStream();
				//构建一个file对象用于存储图片
				File file = new File(Environment.getExternalStorageDirectory(), "pic.jpg");
				fos = new FileOutputStream(file);
				int len = 0;
				byte[] buffer = new byte[1024];
				//将输入流写入到我们定义好的文件中
				while ((len = is.read(buffer)) != -1) {
					fos.write(buffer, 0, len);
				}
				//将缓冲刷入文件
				fos.flush();
				//告诉handler,图片已经下载成功
				handler.sendEmptyMessage(LOAD_SUCCESS);
			}
		} catch (Exception e) {
			//告诉handler,图片已经下载失败
			handler.sendEmptyMessage(LOAD_ERROR);
			e.printStackTrace();
		} finally {
			//在最后,将各种流关闭
			try {
				if (is != null) {
					is.close();
				}
				if (fos != null) {
					fos.close();
				}
			} catch (Exception e) {
				handler.sendEmptyMessage(LOAD_ERROR);
				e.printStackTrace();
			}
		}
	}

}

布局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical" >

    <ImageView
        android:id="@+id/image"
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:scaleType="centerCrop" />

    <Button
        android:onClick="show"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:text="显示" />

</LinearLayout>

运行结果

不要忘记添加权限

 <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

【Android进阶】使用HttpURLConnection实现图片的下载与现显示

时间: 2024-10-07 10:12:39

【Android进阶】使用HttpURLConnection实现图片的下载与现显示的相关文章

【Android进阶】使用HttpURLConnection实现网页源码的下载

上一篇文章主要介绍的图片文件的下载与显示,这一篇文章主要介绍如何根据网页的地址,获取网页源代码的获取 其实,网站源代码的获取比图片的下载与显示更加简单,只需要对之前的代码稍作修改即可 public class OtherActivity extends Activity { private TextView tv; private static final int LOAD_SUCCESS = 1; private static final int LOAD_ERROR = -1; privat

Android中使用HttpURLConnection实现GET POST JSON数据与下载图片

Android6.0中把Apache HTTP Client所有的包与类都标记为deprecated不再建议使用 所有跟HTTP相关的数据请求与提交操作都通过HttpURLConnection类实现,现实是 很多Android开发者一直都Apache HTTP Client来做andoird客户端与后台HTTP接口数 据交互,本人刚刚用HttpURLConnection做了一个android的APP,不小心踩到了几个 坑,总结下最常用的就通过HttpURLConnection来POST提交JSO

Android进阶:ListView性能优化异步加载图片 使滑动效果流畅

ListView 是一种可以显示一系列项目并能进行滚动显示的 View,每一行的Item可能包含复杂的结构,可能会从网络上获取icon等的一些图标信息,就现在的网络速度要想保持ListView运行的很好滚动流畅是做不到的 所以这里就需要把这些信息利用多线程实现异步加载 实现这样功能的类 [java] view plaincopy public class AsyncImageLoader { private HashMap<String, SoftReference<Drawable>&

Android开发之异步获取并下载网络资源-下载图片和下载文本内容

在android网络开发过程中,经常需要获取网络资源,比如下载图片,下载文本文件内容等,这个时候就需要http请求来获取相应的网络资源.首先看看实例效果图:              下载图片截图                                                                                                下载文本文件内容截图 下面介绍如何来实现这样的开发: (1)从指定的URL获取对应的流 既然要获取网络资源,那么

Android进阶图片处理之三级缓存方案

图片的三级缓存 一.概述 一開始在学习Android的时候.处理图片的时候,每次获取图片都是直接从网络上面载入图片. 可是在开发项目的过程中,每次点击进入app里面,图片都要慢慢的再一次从网络上面载入. 给用户的体验很不好,第一个等待的时间很令人dan 疼 第二个给用户的流量造成了不必要的浪费 因此提出图片的三级缓存策略, 所谓的三级缓存:就是在手机载入图片的时候, 1.首先从内存中载入, 2.假设内存中没有的话,从sd卡上获取.读取到之后将图片写入到内存中 3.假设sd卡上没有的话,从网络上获

Android 解决图片大量下载:软引用必须懂4点

Android 解决图片大量下载:软引用必须懂4点 可能对于Android开发者来说,软引用这个词有的会不是很熟悉,软引用在Java开发中用的比较多,但是,在Android开发中引用软引用,会给我们解决很多难题. AD: 1.对象的强.软.弱和虚引用 为了能更加灵活控制对象的生命周期,需要知道对象引用的4中级别,由高到低依次为 :强引用.软引用.弱引用和虚引用 备注: 这四种的区别: ⑴强引用(StrongReference) 强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会

我的Android进阶之旅------&gt; Android在TextView中显示图片方法

面试题:请说出Android SDK支持哪些方式显示富文本信息(不同颜色.大小.并包含图像的文本信息),并简要说明实现方法. 答案:Android SDK支持如下显示富文本信息的方式. 1.使用TextView组件可以显示富文本信息.在TextView组件中可以使用富文本标签来显示富文本信息,这种标签类似于HTML标签,但比HTML标签简单,支持有限的几种显示富文本的方式.如<font>标签用于设置字体和颜色,<b>用于设置粗体.包含这些标签的文本不能直接作为TextView.se

2016年最牛逼的分类Android项目源码免费一次性打包下载!

之前发过一个帖子,但是那个帖子有点问题我就重新发一个吧,下面的源码是我从今年开始不断整理源码区和其他网站上的安卓例子源码,目前总共有810套左右,根据实现的功能被我分成了100多个类,总共接近2.5G,还在不断更新.初学者可以快速方便的找到自己想要的例子,大神也可以看一下别人的方法实现.虽然的例子都是我一个人辛辛苦苦花了很多时间和精力整理的,但是既然这些例子是来自于社区那就让他们免费回归社区吧,(是的!特么的不要一分钱!最看不起那些挂羊头卖狗的)你可以在本帖里面按Ctrl+F查找你需要的关键字,

我的Android进阶之旅------&gt;经典的大牛博客推荐(排名不分先后)!!

本文来自:http://blog.csdn.net/ouyang_peng/article/details/11358405 今天看到一篇文章,收藏了很多大牛的博客,在这里分享一下 谦虚的天下 柳志超博客 Android中文Wiki AndroidStudio-NDK开发-移动开发团队谦虚的天下 - 博客园gundumw100博客 - android进阶分类文章列表 - ITeye技术网站CSDN博文精选:Android系列开发博客资源汇总 - CSDN.NET - CSDN资讯Android笔