Android中的Http通信(二)

>  这篇博客紧接上一篇:Android中的Http通信(一)讲述Http通信。本文分别用两个例子说明:

>  网络请求到百度的网页,展示到一个webview上。

>  网络请求一张图片,展示到界面的ImageView上。


1.3 HttpUrlConnection介绍。


1.3.1 网络请求到百度的网页,展示到一个webview上。

>  首先创建一个工程Http_01。为了能够访问网络,必须在清单文件中声明网络访问权限:

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

在activity_main.xml布局文件中声明一个WebView控件,将访问网络的信息显示在webView上:

<span style="white-space:pre">	</span><WebView
        android:id="@+id/webView1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true" />
在MainActivity中初始化webView。为了访问网络,因为访问网络是个耗时操作,所以放在一个线程中去执行。新建一个java文件HttpThread类,在这个类中实现网络访问:
<span style="color:#330033;">public class HttpThread extends Thread {
	private String url;

	private WebView webView;

	private Handler handler;

	// 构造函数,初始化变量
	public HttpThread(String url, WebView webView, Handler handler) {
		this.url = url;
		this.webView = webView;
		this.handler = handler;
	}

	@Override
	public void run() {
		try {
			URL httpUrl = new URL(url);
			try {
				HttpURLConnection conn = (HttpURLConnection) httpUrl
						.openConnection();
				conn.setReadTimeout(5000);
				conn.setRequestMethod("GET");
				final StringBuffer sb = new StringBuffer();
				BufferedReader reader = new BufferedReader(
						new InputStreamReader(conn.getInputStream()));
				String str;
				while ((str = reader.readLine()) != null) {
					sb.append(str);
				}

				handler.post(new Runnable() {

					@Override
					public void run() {
						// TODO Auto-generated method stub
						webView.loadData(sb.toString(),
								</span><span style="color:#ff0000;">"text/html;charset=utf-8",</span><span style="color:#330033;"> null);
					}
				});
			} catch (IOException e) {
				e.printStackTrace();
			}
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}
	}
}</span>
上面代码中红色部分为百度页面源代码中content内容所引部分。完成了上面的内容,然后在MainActivity.java的onCreate()方法中去开启HttpThread:

new HttpThread("http://www.baidu.com", webView, handler).start();
运行工程效果如图:


1.3.2 网络请求一张图片,展示到界面的ImageView上。
>  接下来我们再从网络请求一张图片展示到界面上。将原来activity_main.xml布局文件中的WebView控件设置成隐藏,新声明一个ImageView控件,用来展示图片:

<span style="white-space:pre">	</span><ImageView
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
在MainActivity中初始化imageView。然后在HttpThread类中实现网络获取图pain的逻辑,代码如下:

<span style="white-space:pre">	</span>// 构造函数,初始化变量
	public HttpThread(String url, ImageView imageView, Handler handler) {
		this.url = url;
		this.imageView = imageView;
		this.handler = handler;
	}

	@Override
	public void run() {
		try {
			URL httpUrl = new URL(url);
			try {
				HttpURLConnection conn = (HttpURLConnection) httpUrl
						.openConnection();
				conn.setReadTimeout(5000);
				conn.setRequestMethod("GET");
				conn.setDoInput(true);
				InputStream is = conn.getInputStream();
				FileOutputStream out = null;
				File downloadFile = null;

				String fileName = String.valueOf(System.currentTimeMillis());
				// 判断sd卡是否处于挂载状态
				if (Environment.getExternalStorageState().equals(
						Environment.MEDIA_MOUNTED)) {
					// 获取sd卡的目录作为下载图片的父目录
					File parent = Environment.getExternalStorageDirectory();
					// 创建存放下载网络图片的文件目录
					downloadFile = new File(parent, fileName);

					out = new FileOutputStream(downloadFile);
				}
				/*
				 * 通过流的形式将网络图片下载到文件downloadFile中
				 */
				byte[] b = new byte[2 * 1024];
				int len;
				if (out != null) {
					while ((len = is.read(b)) != -1) {
						out.write(b, 0, len);
					}
				}

				final Bitmap bitmap = BitmapFactory.decodeFile(downloadFile
						.getAbsolutePath());
				handler.post(new Runnable() {

					@Override
					public void run() {
						imageView.setImageBitmap(bitmap);
					}
				});
				/*
				 * final StringBuffer sb = new StringBuffer(); BufferedReader
				 * reader = new BufferedReader( new
				 * InputStreamReader(conn.getInputStream())); String str; while
				 * ((str = reader.readLine()) != null) { sb.append(str); }
				 * 
				 * handler.post(new Runnable() {
				 * 
				 * @Override public void run() { // TODO Auto-generated method
				 * stub webView.loadData(sb.toString(),
				 * "text/html;charset=utf-8", null); } });
				 */
			} catch (IOException e) {
				e.printStackTrace();
			}
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}
	}
回到MainActivity中,对原来新建的HttpThread线程进行修改:

new HttpThread("<span style="color:#ff0000;">http://img.ivsky.com/img/bizhi/pic/201012/24/aodaili_heben-001.jpg</span>", <span style="color:#ff0000;">imageView</span>, handler).start();
上面的http://img.ivsky.com/img/bizhi/pic/201012/24/aodaili_heben-001.jpg是一张网络图片(奥黛丽·赫本)的照片。
因为在代码中我们对sd卡进行了操作,所以还需再清单文件中配置外存储卡可写的权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
运行工程,程序界面就会显示从网络获取的图片。如图:

以上就是两个例子。


ps:本文接着下一篇文章:Android中的Http通信(三)

> 本文的代码链接http://download.youkuaiyun.com/detail/programmerteny/9473219,

可下载研究。









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值