【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; }}
转载请注明原文地址: https://ju.6miu.com/read-1123101.html