【HttpUrlConnection】网址源码查看器(1)

    xiaoxiao2022-06-23  15

    【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

    最新回复(0)