package com.lidaochen.test;

import java.io.ByteArrayOutputStream;
import java.io.InputStream; public class StreamTools {
// 把InputStream转换成String
public static String readStream(InputStream in) throws Exception
{
// 定义一个内存输出流
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
int len = -1;
byte[] buffer = new byte[1024]; // 1kb
while ((len = in.read(buffer)) != -1)
{
byteArrayOutputStream.write(buffer, 0, len);
}
in.close();
String content = new String(byteArrayOutputStream.toByteArray());
return content;
}
}
package com.lidaochen.test;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast; import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL; public class MainActivity extends AppCompatActivity {
protected final int REQUESTSUCESS = 0;
protected final int REQUESTNOTFOUND = 1;
protected final int REQUESTEXCEPTION = 2;
private EditText et_path;
private TextView tv_result;
// 在主线程中定义一个handler
private Handler handler = new Handler()
{
// 这个方法是在主线程里面执行的
@Override
public void handleMessage(android.os.Message msg) {
// super.handleMessage(msg);
// 区分一下是发送的哪条消息
switch (msg.what)
{
case REQUESTSUCESS:
// 代表请求成功
String content = (String)msg.obj;
tv_result.setText(content);
break;
case REQUESTNOTFOUND:
Toast.makeText(getApplicationContext(), "请求的资源不存在!", Toast.LENGTH_SHORT).show();
break;
case REQUESTEXCEPTION:
Toast.makeText(getApplicationContext(), "服务器繁忙,请稍后......", Toast.LENGTH_SHORT).show();
break;
default:
break;
} }
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 找到EditText控件
et_path = (EditText)findViewById(R.id.et_path);
// 找到EditText控件
tv_result = (TextView)findViewById(R.id.tv_result);
}
// 避免anr 可以把耗时的操作放到子线程中
// 在4.0之后谷歌强制要求连接网络不能在主线程进行访问
// 只有主线程才可以更新UI
public void click(View v)
{
// 创建一个子线程
new Thread()
{
public void run()
{
try
{
// 获取源码网址路径
String path = et_path.getText().toString().trim();
// 创建URL对象,指定我们要访问的网址
URL url = new URL(path);
// 拿到HttpURLConnection对象,用于发送或者接收数据
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// 设置发送get请求
connection.setRequestMethod("GET"); // get要求大小,其实默认就是get请求
// 设置请求超时时间
connection.setReadTimeout(5000);
// 获取服务器返回的状态码
int code = connection.getResponseCode();
// 如果code == 200说明请求成功
if (code == 200)
{
// 获取服务器返回的数据,是以流的形式返回的
InputStream is = connection.getInputStream();
// 使用我们定义的工具类,把is 转换成String
String content = StreamTools.readStream(is);
// 创建message对象
Message msg = new Message();
msg.what = REQUESTSUCESS;
msg.obj = content;
// 用我们创建的handler助手给系统发消息
handler.sendMessage(msg);
}
else
{
// 请求资源不存在 Toast是一个view 也不能在在线程更新ui
Message msg = new Message();
msg.what = REQUESTNOTFOUND;
handler.sendMessage(msg);
}
}
catch (Exception e)
{
e.printStackTrace();
Message msg = new Message();
msg.what = REQUESTEXCEPTION;
handler.sendMessage(msg);
}
}
}.start();
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/et_path"
android:hint="请输入网址..."/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="查看"
android:onClick="click"/>
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/tv_result"/>
</ScrollView>
</LinearLayout>

安卓开发之HttpURLConnection类和Handler类的使用的更多相关文章

  1. android开发之 Wifi的四个类

    android开发之 Wifi的四个类 在Android中对Wifi操作,android本身提供了一些实用的包,在android.net.wifi包以下.简介一下: 大致能够分为四个基本的类ScanR ...

  2. spark快速开发之scala基础之3类,对象,特征

    类 scala的类定义非常灵活 class test4 class test2{} class test3(x:Int) 定义一个带构造函数的类 class Point (x : Int,y : In ...

  3. 安卓开发之json解析

    1.从网页获取json返回字符串 public class ReadNet extends AsyncTask<URL, Integer, String> { @Override      ...

  4. Liferay7 BPM门户开发之34: liferay7对外服务类生成(RestService Get Url)

    在liferay7中开发不依赖Service Builder的对外服务类,非常简洁,只需要2点注解: 在类的前部定义: @ApplicationPath("/PathXXX") 方 ...

  5. 安卓开发之ListAdapter(一)

    Adapter常用来管理数据,是连接后端数据和前端显示的适配器接口,是数据和UI(view)之间一个重要的纽带.再常见的view(listview.gridview)等地方都需要用到adapter,下 ...

  6. 安卓开发之RecyclerView

    RecyclerView是一个非常好用的控件,它的效果和ListView很相似,甚至可以说RecyclerView的出现是来取代ListView的 RecyclerView比ListView更加灵活, ...

  7. 安卓开发之APK安装之后自动在桌面上创建快捷图标

    可以看到很多的APP在第一次运行之后就会弹出来一个Toast说什么快捷方式已创建,那么这个东西是怎么搞出来的呢 很简单就下面几句话,写在这儿以后好copy 先创建一个类 import android. ...

  8. 安卓开发之Room实体定义数据

    使用Room实体定义数据 在Room库中,entities(实体)代表着相关字段集.每一个entity(实体)代表着相关联数据库中的一个表.entity 类必须通过Database 类中的entiti ...

  9. 安卓开发之Toolbar

    根据官网的教程,发现实现与预期不一致,查看相关资料自己整理了一下(官网开发文档:https://developer.android.com/training/appbar/setting-up.htm ...

随机推荐

  1. 数据分析 - Power BI 链接 mysql 数据分析

    链接数据库 点击确定后选择数据库, 然后输入用户名密码, 选择级别选择指定的数据库即可 之后弹出的导航器中即可有可预览的数据 更加推荐使用 再链接数据库的时候高级查询的 sql 中进行 sql 的执行 ...

  2. 18.flannel

    18.flannel docker有四种常用网络 bridge joined opended 直接共享使用节点的网络名称空间 none k8s网络通信: 容器间的通信: 同一个Pod内的多个容器之间通 ...

  3. spring 事务-使用@Transactional 注解(事务隔离级别)

    转: spring 事务-使用@Transactional 注解(事务隔离级别) 2016年08月11日 21:49:20 华华鱼 阅读数 15490 标签: spring事务Transactiona ...

  4. 5G 与 MEC 边缘计算

    目录 文章目录 目录 前言 参考文献 通信网络 核心网演进之路 早古时期 2G 网络架构 3G 网络架构 4G 网络架构 5G 5G 网络的需求 5G 网络架构的设计原则 5G 网络的逻辑架构 5G ...

  5. mac下不允许安装除了app store之外的软件设置:

    1.dock栏的系统偏好设置. 2.找到安全性与隐私 3.点击面板中的通用,在点击左小角的锁按钮, 4.选择任何来源,确定就可以了.[如果只有两个选项,而没有任何来源的话,打开终端,执行:sudo s ...

  6. 图解 HTTP 笔记(六)——HTTP 首部

    本章主要讲解了 HTTP 首部的结构,已经首部中各字段的用法. 一.HTTP 报文首部 上图是 HTTP 请求报文的结构. HTTP 请求报文由方法.URI.HTTP 版本.HTTP 首部字段等组成. ...

  7. mysql大数据量下优化

    1 优化sql和索引2 增加缓存如:redis3 主从复制或主主复制,读写分离4 利用mysql自带分区表5 先做垂直拆分,将一个大系统分为多个小系统,也就是分布式6 水平切分,要选择一个合理的sha ...

  8. Spring Security(4):自定义配置

    接着上节的讲,在添加了@EnableWebSecurity注解后,如果需要自定义一些配置,则需要和继承WebSecurityConfigurerAdapter后,覆盖某些方法. 我们来看一下WebSe ...

  9. CockroachDB学习笔记——[译]Cgo的成本与复杂性

    原文链接:https://www.cockroachlabs.com/blog/the-cost-and-complexity-of-cgo/ 原作者:Tobias Schottdorf 原文日期:D ...

  10. 数据质量、特征分析及一些MATLAB函数

    MATLAB数据分析工具箱 MATLAB工具箱主要含有的类别有: 数学类.统计与优化类.信号处理与通信类.控制系统设计与分析类.图像处理类.测试与测量类.计算金融类.计算生物类.并行计算类.数据库访问 ...