> 这篇博客紧接上一篇: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,
可下载研究。