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



【1】获取布局id
【2】设置点击事件
【3】 由于在主线程中不允许访问网络 则需要新建一个子线程
   
   
  1. new Thread(){
  2. public void run(){
  3. }
  4. }.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位于主线程中




代码如下:
   
   
  1. package com.example.httpurlconnectiondemo;
  2. import java.io.InputStream;
  3. import java.net.HttpURLConnection;
  4. import java.net.URL;
  5. import android.app.Activity;
  6. import android.os.Bundle;
  7. import android.os.Handler;
  8. import android.os.Message;
  9. import android.view.View;
  10. import android.widget.EditText;
  11. import android.widget.TextView;
  12. import android.widget.Toast;
  13. public class MainActivity extends Activity {
  14. protected final int REQUESTFAIL = 0;
  15. protected final int REQUESTSUCCESS = 1;
  16. protected final int REQUESTEXCEPTION = 2;
  17. private EditText et_web;
  18. private TextView tv_content;
  19. private Handler handler =new Handler(){
  20. @Override
  21. public void handleMessage(Message msg) {
  22. switch (msg.what) {
  23. case REQUESTFAIL:
  24. Toast.makeText(getApplicationContext(), "请求失败", 0).show();
  25. break;
  26. case REQUESTSUCCESS:
  27. String content=(String) msg.obj;
  28. tv_content.setText(content);
  29. break;
  30. case REQUESTEXCEPTION:
  31. Toast.makeText(getApplicationContext(), "服务器忙", 1).show();
  32. break;
  33. }
  34. }
  35. };
  36. @Override
  37. protected void onCreate(Bundle savedInstanceState) {
  38. super.onCreate(savedInstanceState);
  39. setContentView(R.layout.activity_main);
  40. //[1]找id
  41. et_web = (EditText) findViewById(R.id.et_web);
  42. tv_content = (TextView) findViewById(R.id.tv_content);
  43. }
  44. //设置点击事件
  45. public void click(View v){
  46. //访问网络需要新建一个子线程 但是子线程又不能更新UI 这时需要引出handle消息机制
  47. new Thread(){
  48. public void run(){
  49. //[1]从edittext获取输入的网址路径
  50. String path=et_web.getText().toString().trim();
  51. //[2]创建url 对象是我们要输入的网址
  52. try {
  53. URL url=new URL(path);
  54. //[3]拿到httpurlconnection对象 用于发送或接收数据
  55. HttpURLConnection conn=(HttpURLConnection) url.openConnection();
  56. //[4]设置发送GET请求
  57. conn.setRequestMethod("GET");
  58. //[5]设置超时时间
  59. conn.setConnectTimeout(5000);
  60. //[6]获取从服务器返回的返回码
  61. int code = conn.getResponseCode();
  62. //[7]若返回码是200 则表示请求成功
  63. if(code==200){
  64. //[8]返回的数据是以流的形式返回
  65. InputStream in=conn.getInputStream();
  66. //[9]将流转换成字符串
  67. String content=StringUtils.StringToString(in);
  68. //[10]由于子线程又不能更新UI 这时需要引出handle消息机制
  69. //创建message对象
  70. Message msg=new Message();
  71. msg.what=REQUESTSUCCESS;
  72. msg.obj=content;
  73. //发送一条消息 消息将数据放到了msg中 handleMessage方法就会执行
  74. handler.sendMessage(msg);
  75. }else{
  76. Message msg=new Message();
  77. msg.what=REQUESTFAIL;
  78. handler.sendMessage(msg);
  79. }
  80. } catch (Exception e) {
  81. e.printStackTrace();
  82. Message msg=new Message();
  83. msg.what=REQUESTEXCEPTION;
  84. handler.sendMessage(msg);
  85. }
  86. }
  87. }.start();
  88. }
  89. }
  90. //封装的将流转换成字符串的类
  91. package com.example.httpurlconnectiondemo;
  92. import java.io.ByteArrayOutputStream;
  93. import java.io.IOException;
  94. import java.io.InputStream;
  95. public class StringUtils {
  96. public static String StringToString(InputStream in) throws IOException{
  97. //定义一个内存输出流
  98. ByteArrayOutputStream baos=new ByteArrayOutputStream();
  99. //读取流
  100. byte[] buf = new byte[1024];
  101. int len=-1;
  102. while((len=in.read(buf))!=-1){
  103. baos.write(buf,0,len);
  104. }
  105. //将流转换成字符串
  106. String content = new String(baos.toString());
  107. return content;
  108. }
  109. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值