【1】获取布局id
【2】设置点击事件
【3】
由于在主线程中不允许访问网络 则需要新建一个子线程
new Thread(){
public void run(){
}
}.start();
【4】在子线程中操作
【4.1】从EditText中获取网址路径
【4.2】新建一个URL对象
【4.3】
拿到httpurlconnection对象 用于发送或接收数据
【4.4】设置发送GET请求
【4.5】设置超时时长
【4.6】获取从服务器访问的返回码
【4.7】若返回码为200,表示请求成功
【4.8】请求的返回数据是以流的形式返回的
【4.8.1】返回流
【4.8.2】将流转换为字符串 这里将该方法封装起来了 详见【StreamToString】
【4.9】这时需要将字符串更新到TextView上
由于子线程中不允许更新UI 则引出Handle机制
【4.10】调用handle.sendMessage();
【5】在主线程中新建Handler对象 重写handleMessage方法
public void handleMessage(Message msg) {
}
这样就可以在handler中更新UI 因为handler位于主线程中
代码如下:
package com.example.httpurlconnectiondemo;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
protected final int REQUESTFAIL = 0;
protected final int REQUESTSUCCESS = 1;
protected final int REQUESTEXCEPTION = 2;
private EditText et_web;
private TextView tv_content;
private Handler handler =new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case REQUESTFAIL:
Toast.makeText(getApplicationContext(), "请求失败", 0).show();
break;
case REQUESTSUCCESS:
String content=(String) msg.obj;
tv_content.setText(content);
break;
case REQUESTEXCEPTION:
Toast.makeText(getApplicationContext(), "服务器忙", 1).show();
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//[1]找id
et_web = (EditText) findViewById(R.id.et_web);
tv_content = (TextView) findViewById(R.id.tv_content);
}
//设置点击事件
public void click(View v){
//访问网络需要新建一个子线程 但是子线程又不能更新UI 这时需要引出handle消息机制
new Thread(){
public void run(){
//[1]从edittext获取输入的网址路径
String path=et_web.getText().toString().trim();
//[2]创建url 对象是我们要输入的网址
try {
URL url=new URL(path);
//[3]拿到httpurlconnection对象 用于发送或接收数据
HttpURLConnection conn=(HttpURLConnection) url.openConnection();
//[4]设置发送GET请求
conn.setRequestMethod("GET");
//[5]设置超时时间
conn.setConnectTimeout(5000);
//[6]获取从服务器返回的返回码
int code = conn.getResponseCode();
//[7]若返回码是200 则表示请求成功
if(code==200){
//[8]返回的数据是以流的形式返回
InputStream in=conn.getInputStream();
//[9]将流转换成字符串
String content=StringUtils.StringToString(in);
//[10]由于子线程又不能更新UI 这时需要引出handle消息机制
//创建message对象
Message msg=new Message();
msg.what=REQUESTSUCCESS;
msg.obj=content;
//发送一条消息 消息将数据放到了msg中 handleMessage方法就会执行
handler.sendMessage(msg);
}else{
Message msg=new Message();
msg.what=REQUESTFAIL;
handler.sendMessage(msg);
}
} catch (Exception e) {
e.printStackTrace();
Message msg=new Message();
msg.what=REQUESTEXCEPTION;
handler.sendMessage(msg);
}
}
}.start();
}
}
//封装的将流转换成字符串的类
package com.example.httpurlconnectiondemo;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
public class StringUtils {
public static String StringToString(InputStream in) throws IOException{
//定义一个内存输出流
ByteArrayOutputStream baos=new ByteArrayOutputStream();
//读取流
byte[] buf = new byte[1024];
int len=-1;
while((len=in.read(buf))!=-1){
baos.write(buf,0,len);
}
//将流转换成字符串
String content = new String(baos.toString());
return content;
}
}