您的位置:首页 > 理论基础 > 计算机网络

Android中的Http通信(二)

2016-03-26 12:28 501 查看
>  这篇博客紧接上一篇: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.csdn.net/detail/programmerteny/9473219,

可下载研究。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Http通信