使用步骤:

1.创建Url

2.用Url打开连接

3.设置请求参数

4. 获取响应状态码

  2xxx 请求成功 3xxx重定向 4xxx资源错误 5xxx服务器错误

5.获取服务器返回的二进制输入流

6.添加网络权限
  <uses-permission
android:name="android.permission.INTERNET"/>


示例代码:

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
public class MainActivity extends Activity {
private EditText etPath;
private ImageView iv;
private String path;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
etPath = (EditText) findViewById(R.id.et_path);
// 在主线程中创建
iv = (ImageView) findViewById(R.id.iv);
}
// 1. 在主线程中创建Hanlder对象
Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
// 把图片显示在imageview上
iv.setImageBitmap((Bitmap)msg.obj);
};
};
// 3. 在handleMessage()中修改UI /**
* 1. 获取服务器返回的二进制输入流
* 2. 把流转成位图对象
* 3. 把图片显示在imageview上
*/
public void look(View v) {
System.out.println("点击按钮的线程:" + Thread.currentThread().getName());
path = etPath.getText().toString().trim();
if (TextUtils.isEmpty(path) || !path.startsWith("http")) {
Toast.makeText(this, "请输入正确的网址", 0).show();
return;
}
// 开启线程
new Thread() {
public void run() {
requestNetWork();
};
}.start();
}
/**
* 网络通讯
*/
protected void requestNetWork() {
try {
// 1. 写一个Url
URL url = new URL(path);
// 2. 用这个Url打开http连接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// 3. 设置请求参数
// 不设置,默认就是get请求
conn.setRequestMethod("GET");
conn.setConnectTimeout(3000);
// 4. 获取状态吗
// * 2xxx响应成功 3xxx重定向 4xxx资源错误 5xxx服务器错误
int code = conn.getResponseCode();
if (code == 200) {
// 5. 获取服务返回的二进制输入流
InputStream is = conn.getInputStream();
// 把流转成位图对象
Bitmap bmp = BitmapFactory.decodeStream(is);
// 2. 在子线程中用handler发消息
Message msg = new Message();
msg.obj = bmp;
mHandler.sendMessage(msg);
} else {
// Toast.makeText(this, "code:"+code, 0).show();
}
} catch (Exception e) {
e.printStackTrace();
// Toast.makeText(this, "服务器忙", 0).show();
}
}
}

查看网络文字示例代码
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast; public class MainActivity extends Activity { private static final int MSG_SUCC = 0;
private static final int MSG_ERR = 1;
private static final int MSG_ERR_CODE = 2;
private EditText etPath;
private TextView tvContent;
private String path;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
etPath = (EditText) findViewById(R.id.et_path);
tvContent = (TextView) findViewById(R.id.tv);
}
/**
* 1. 获取用户输入的网址,做非空判断
* 2. 在子线程中进行网络通讯
* 3. 获取服务器返回的二进制数据流
* 4. 把流转成文字
* 5. 用Handler显示文字
*/
public void look(View v) {
// 获取用户输入的网址,做非空判断
path = etPath.getText().toString().trim();
if (TextUtils.isEmpty(path) || !path.startsWith("http")) {
Toast.makeText(this, "亲,请输入正确的网址,例如http开头", 0).show();
return;
}
// 在子线程中进行网络通讯
new Thread() {
public void run() {
requestNetWork();
};
}.start();
}
/**
* 获取服务器返回的二进制数据流
*/ protected void requestNetWork() {
try {
// 1. 写一个Url
URL url = new URL(path);
// 2. 用这个Url打开http连接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// 3. 设置请求参数
conn.setRequestMethod("GET");
conn.setConnectTimeout(3000);
// 4. 获取状态吗
// * 2xxx响应成功 3xxx重定向 4xxx资源错误 5xxx服务器错误
int code = conn.getResponseCode();
if (code == 200) {
// 5. 获取服务返回的二进制输入流
InputStream is = conn.getInputStream();
// 把流转成文字
String text = StringUtils.parseStream2Str(is);
// 用Handler显示文字
Message msg = Message.obtain();// 从消息池中获取消息
msg.obj = text;
msg.what = MSG_SUCC;
mHandler.sendMessage(msg);
} else {
Message msg = Message.obtain();// 从消息池中获取消息
msg.obj = code;
msg.what =MSG_ERR_CODE;
mHandler.sendMessage(msg); } } catch (Exception e) { e.printStackTrace(); mHandler.sendEmptyMessage(MSG_ERR);
}
}
Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_SUCC:
tvContent.setText((String) msg.obj);
break;
case MSG_ERR_CODE:
Toast.makeText(MainActivity.this, "code:"+msg.obj, 0).show();
break;
case MSG_ERR:
Toast.makeText(MainActivity.this, "服务器忙", 0).show();
break;
default:
break;
}
};
};
}

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
/**
* 操作字符
*/
public class StringUtils {
/**
* 从流中转成字符串
*
* @param is
* 输入流
* @return null表示失败
*/
public static String parseStream2Str(InputStream is) {
//内存输出流
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int len = -1;
byte[] buffer = new byte[1024*8];
try {
while((len = is.read(buffer)) != -1){
baos.write(buffer, 0, len);
}
return new String(baos.toByteArray());
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}

HttpURLConnection获取数据的更多相关文章

  1. java分别通过httpclient和HttpURLConnection获取图片验证码内容

    前面的文章,介绍了如何通过selenium+Tesseract-OCR来识别图片验证码,如果用接口来访问的话,再用selenium就闲的笨重,下面就介绍一下分别通过httpclient和HttpURL ...

  2. Android系列之网络(一)----使用HttpClient发送HTTP请求(通过get方法获取数据)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  3. (一)----使用HttpClient发送HTTP请求(通过get方法获取数据)

    (一)----使用HttpClient发送HTTP请求(通过get方法获取数据) 一.HTTP协议初探: HTTP(Hypertext Transfer Protocol)中文 “超文本传输协议”,是 ...

  4. 从api接口获取数据-okhttp

    首先先介绍下api接口: API:应用程序接口(API:Application Program Interface) 通常用于数据连接,调用函数提供功能等等... 从api接口获取数据有四种方式:Ht ...

  5. androidclient和站点数据交互的实现(基于Http协议获取数据方法)

    androidclient一般不直接訪问站点数据库,而是像浏览器一样发送get或者post请求.然后站点返回client能理解的数据格式,client解析这些数据.显示在界面上.经常使用的数据格式是x ...

  6. HttpClient获取数据

    HttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议 ...

  7. WCF+Restfull服务 提交或获取数据时数据大小限制问题解决方案

    近日在使用wcf的restfull架构服务时遭遇到了提交大数据的问题. 大数据包含两种情形: 1)单条数据量过大. 2)提交或获取的数据条数过多. 在测试时发现,默认设置下当单条JSON数据大于30K ...

  8. python httplib get和post获取数据

    httplib 下的 status http请求的状态  200 404 500... reason 返回答复 OK或者 FAULRE read()  读取内容 get方法: #!/usr/bin/e ...

  9. 从SQLite获取数据完成一个产品信息展示

    在ios实际开发当中,我们常常用到Core Data做为数据储存首选.但在处理一些大量复杂的数据值且数据之间相互关联的时候,这就不得不使用关系型数据库来实现.例如一个导航程序,自身应该包含大量的地图自 ...

随机推荐

  1. 【python】python _、__、__xx__之间的差别

    本文来自 yzl11 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/yzl11/article/details/53792416?utm_source=copy 单下 ...

  2. SiteOmat

    卡巴斯基实验室高级安全研究员Ido Naor和以色列安全研究员Amihai Neiderman在卡巴斯位于墨西哥坎昆举行的安全分析师峰会期间,就加油站的安全问题展开了全面分析.他们的研究表明,攻击者可 ...

  3. Form组件 cookie和session

    django form组件 1.渲染标签 2.校验数据 3.展示信息 第一步需要一个form类 from django import forms class MyForm(forms.Form): n ...

  4. 用实例的方式去理解storm的并发度

    什么是storm的并发度 一个topology(拓扑)在storm集群上最总是以executor和task的形式运行在suppervisor管理的worker节点上.而worker进程都是运行在jvm ...

  5. SQL 递归查询,意淫CTE递归的执行步骤

    今天用到了sql的递归查询.递归查询是CTE语句with xx as(....)实现的. 假如表Category数据如下. 我们想查找机枪这个子分类极其层次关系(通过子节点,查询所有层级节点).以下是 ...

  6. [转载]Java并发编程:volatile关键字解析

    Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在 ...

  7. 回顾了下shell 编程的一些细节

    回顾了一些细节 shell 的通配符扩展   *  ? []  [^xxxx]  {aaa,bbb}         子进程 more `grep -l POSIX *` more $(grep -l ...

  8. NOI2018 你的名字——SAM+线段树合并

    题目链接在这里洛谷/LOJ 题目大意 有一个串\(S\),每次询问给你一个串\(T\),两个数\(L\)和\(R\),问你\(T\)有多少个本质不同的子串不是\(S[L,R]\)的子串 SOLUTIO ...

  9. WPF DevExpress ChartControl使用之XYDiagram

    WPF使用Dev和WinForm有许多不同,相对而言,WPF要更简单和炫酷一点,我只做了一点基本的功能,没有仔细的研究,这里只介绍一下WPF Dev ChartControl绘制XYDiagram的基 ...

  10. <<代码大全>>阅读笔记之二 变量名的力量

    1.变量命名的注意事项 1)可理解性 变量要望文知义,看到这个变量不用看其他的代码就知道这个变量表示什么意思 好的变量命:currentDate, heartRate 糟糕的变量名:newButton ...