安卓开发之HttpURLConnection类和Handler类的使用
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类的使用的更多相关文章
- android开发之 Wifi的四个类
android开发之 Wifi的四个类 在Android中对Wifi操作,android本身提供了一些实用的包,在android.net.wifi包以下.简介一下: 大致能够分为四个基本的类ScanR ...
- spark快速开发之scala基础之3类,对象,特征
类 scala的类定义非常灵活 class test4 class test2{} class test3(x:Int) 定义一个带构造函数的类 class Point (x : Int,y : In ...
- 安卓开发之json解析
1.从网页获取json返回字符串 public class ReadNet extends AsyncTask<URL, Integer, String> { @Override ...
- Liferay7 BPM门户开发之34: liferay7对外服务类生成(RestService Get Url)
在liferay7中开发不依赖Service Builder的对外服务类,非常简洁,只需要2点注解: 在类的前部定义: @ApplicationPath("/PathXXX") 方 ...
- 安卓开发之ListAdapter(一)
Adapter常用来管理数据,是连接后端数据和前端显示的适配器接口,是数据和UI(view)之间一个重要的纽带.再常见的view(listview.gridview)等地方都需要用到adapter,下 ...
- 安卓开发之RecyclerView
RecyclerView是一个非常好用的控件,它的效果和ListView很相似,甚至可以说RecyclerView的出现是来取代ListView的 RecyclerView比ListView更加灵活, ...
- 安卓开发之APK安装之后自动在桌面上创建快捷图标
可以看到很多的APP在第一次运行之后就会弹出来一个Toast说什么快捷方式已创建,那么这个东西是怎么搞出来的呢 很简单就下面几句话,写在这儿以后好copy 先创建一个类 import android. ...
- 安卓开发之Room实体定义数据
使用Room实体定义数据 在Room库中,entities(实体)代表着相关字段集.每一个entity(实体)代表着相关联数据库中的一个表.entity 类必须通过Database 类中的entiti ...
- 安卓开发之Toolbar
根据官网的教程,发现实现与预期不一致,查看相关资料自己整理了一下(官网开发文档:https://developer.android.com/training/appbar/setting-up.htm ...
随机推荐
- 【I·M·U_Ops】------Ⅱ------ IMU自动化运维平台之CMDB
说明本脚本仅作为学习使用,请勿用于任何商业用途.本文为原创,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接和本声明. #A 我理解的 CMDB CMDB翻译过来,Configuratio ...
- [Scikit-learn] 1.5 Generalized Linear Models - SGD for Classification
NB: 因为softmax,NN看上去是分类,其实是拟合(回归),拟合最大似然. 多分类参见:[Scikit-learn] 1.1 Generalized Linear Models - Logist ...
- Flutter 路由 页面间跳转和传参 返回
Navigator Navigator用来管理堆栈功能(即push和pop),在Flutter的情况下,当我们导航到另一个屏幕时,我们使用Navigator.push方法将新屏幕添加到堆栈的顶部.当然 ...
- ubuntu16.04 下通过rc.d(rc.local)实现开机启动(未登录)anydesk
先编辑anydesk-X.X.X/init/anydesk文件,将"DAEMON=//usr/bin$NAME"改成"DAEMON=/XXX/anydesk-5.1.1/ ...
- Python学习笔记——类和对象
类和对象 1. 一个例子 # 对象 = 属性 + 方法 # Python 中的类名称约定首字母大写,而 Python 函数名首字母小写 class Turtle: #属性 color = 'green ...
- 【ARM-Linux开发】Gstreamer+QT+摄像头 编程总结
1,gstreamer开发手册,gstreamer官网(这些都不用说了吧) 2,gst-launch的用法,这也不用说了吧.(白菜,鸡蛋,西红柿,砖头,鼠标--..) 3,http://blog.ch ...
- pacemaker入门
原文链接:https://blog.csdn.net/a964921988/article/details/82628478 因为数据库部署在Linux上,需要做数据库集群实现高可用,而所有的Post ...
- 洛谷 题解 P2937 【[USACO09JAN]激光电话Laserphones】
看到这题,一下就想到了爆搜.(不过这题输入也是够坑的) 单纯的搜索肯定是会超时的,所以这里需要考虑一些剪枝. 我们令bin[i][j][k]为在第i行j列时,方向为k的最小镜子数,若当时的镜子数已大于 ...
- poj3977(折半枚举+二分查找)
题目链接:https://vjudge.net/problem/POJ-3977 题意:给一个大小<=35的集合,找一个非空子集合,使得子集合元素和的绝对值最小,如果有多个这样的集合,找元素个数 ...
- [翻译] 深入浅出Go语言调度器:第一部分 - 系统调度器
目录 译者序 序 介绍 系统调度器 执行指令 Figure 1 Listing 1 Listing 2 Listing 3 线程状态 任务侧重 上下文切换 少即是多 寻找平衡 缓存行 Figure 2 ...