HttpURLConnection获取数据
使用步骤:
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获取数据的更多相关文章
- java分别通过httpclient和HttpURLConnection获取图片验证码内容
前面的文章,介绍了如何通过selenium+Tesseract-OCR来识别图片验证码,如果用接口来访问的话,再用selenium就闲的笨重,下面就介绍一下分别通过httpclient和HttpURL ...
- Android系列之网络(一)----使用HttpClient发送HTTP请求(通过get方法获取数据)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- (一)----使用HttpClient发送HTTP请求(通过get方法获取数据)
(一)----使用HttpClient发送HTTP请求(通过get方法获取数据) 一.HTTP协议初探: HTTP(Hypertext Transfer Protocol)中文 “超文本传输协议”,是 ...
- 从api接口获取数据-okhttp
首先先介绍下api接口: API:应用程序接口(API:Application Program Interface) 通常用于数据连接,调用函数提供功能等等... 从api接口获取数据有四种方式:Ht ...
- androidclient和站点数据交互的实现(基于Http协议获取数据方法)
androidclient一般不直接訪问站点数据库,而是像浏览器一样发送get或者post请求.然后站点返回client能理解的数据格式,client解析这些数据.显示在界面上.经常使用的数据格式是x ...
- HttpClient获取数据
HttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议 ...
- WCF+Restfull服务 提交或获取数据时数据大小限制问题解决方案
近日在使用wcf的restfull架构服务时遭遇到了提交大数据的问题. 大数据包含两种情形: 1)单条数据量过大. 2)提交或获取的数据条数过多. 在测试时发现,默认设置下当单条JSON数据大于30K ...
- python httplib get和post获取数据
httplib 下的 status http请求的状态 200 404 500... reason 返回答复 OK或者 FAULRE read() 读取内容 get方法: #!/usr/bin/e ...
- 从SQLite获取数据完成一个产品信息展示
在ios实际开发当中,我们常常用到Core Data做为数据储存首选.但在处理一些大量复杂的数据值且数据之间相互关联的时候,这就不得不使用关系型数据库来实现.例如一个导航程序,自身应该包含大量的地图自 ...
随机推荐
- Computer Vision_2_Active Shape Models:Active Shape Models-Their Training and Application——1995
此为计算机视觉部分,主要侧重在底层特征提取,视频分析,跟踪,目标检测和识别方面等方面. 1. Active Appearance Models 活动表观模型和活动轮廓模型基本思想来源 Snake,现在 ...
- Delphi 数组特性
- Python&Selenium&Unittest&BeautifuReport 自动化测试并生成HTML自动化测试报告
一.摘要 本篇博文将介绍如何借助BeautifulReport和HTML模版,生成HTML测试报告的BeautifulReport 源码Clone地址为 https://github.com/Test ...
- JavaScript 基础知识梳理——事件
事件 1)事件是文档或浏览器窗口中发生的特定的交互瞬间. JavaScript和HTML之间的交互是通过事件实现的. 2)事件流——描述的是从页面中接受事件的顺序 IE——事件冒泡流 Netscape ...
- MyBatis-10-多对一处理
10.多对一处理 多对一: 多个学生,对应一个老师 对于学生这边而言,关联...多个学生,关联一个老师[多对一] 对于老师而言,集合,一个老师又很多学生[一对多] SQL: CREATE TABLE ...
- tensorflow.python.framework.errors_impl.PermissionDeniedError: /data; Permission denied
在linux系统中,tensorflow跑mnist数据集出现错误,本应该自动下载的数据集 将mnist自动下载的路径,由/data/mnist之前的/删掉即可.改为data/mnist.
- Linux学习日志(一)
1 .Ubuntu 自带python 2 和 python 3的版本,切换方法如下: shell里执行: sudo update-alternatives --install /usr/bin/pyt ...
- Mybatis那些事-拦截器(Plugin+Interceptor)
作者:yhjyumi的专栏 数据权限实现(Mybatis拦截器+JSqlParser) Mybatis的拦截器实现机制,使用的是JDK的InvocationHandler. 当我们调用Paramete ...
- Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'
方法:重启MySQL 在命令行执行: /etc/init.d/mysql start
- 【Android-GridView控件】 九宫格
效果图: 1.主界面布局 activity_main.xml GridView的三种属性: android:numColumns="" 每一行显示多少列 android:horiz ...