《Android开发卷——HTTP网络通信,HTTP网络连接》
为了访问互联网,需要设置应用程序获取“androd.permission.INTERNET”权限的许可。
一、使用Apache接口(org.apache.http)并实现网络连接的基本知识
HttpClient client = new DefaultHttpClient();
要想从服务器检索有用的网络信息,必须使用HttpGet类构造器来帮助实现
HttpGet request = new HttpGet(“http://www.*****.com/test?id=***&name=****”);
然后还需要类HttpClient的execute()方法的帮助,通过此方法中的HttpGet对象来检索
HttpResponse response = client.execute(request);
最后需要解读已检索的响应(读取网页内容)
BufferedReader rd = new BufferedRreader(new InputStreamReader(response.getEntity().getContent()));
String line = “”;
While((line = rd.readLine()) != null){
Log.d(“output:”,line);
line = line+line;
}
Post方法
HttpClient client = new DafaultHttpClient();
HttpPost post = new HttpPost(URL);
List<NameValuePair> parms = new ArrayList<NameValuePair>();
parms.add(new NameValuePair(“id”,”1001”));
parms.add(new NameValuePair(“name”,”johm”));
HttpEntity formEntity = new UrlEncodeFormEntity(params);
post.setEntity(formEntity,HTTP.UTF_8);
Httpresponse response = new client.execute(post);
If(response.getStatusLine.getStatusCode == HttpStatus.SC_OK){
InputStream is = response.getEntity().getContent();
String result = isStreamString(is);
Assert.assertEqualse(result,”POST_SUCCESS”);//断言判断网页返回的内容是否为” POST_SUCCESS”;
} private String isStreamString(InputStream is) throws Exception{
ByteArrayOutputStream bo = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
int len = -1;
while((len = is.read(buf)) != -1){
bo.write(buf,0,len);
}
return new String(bo.toByteArray());
}
在文件MyApplication.java中扩展了系统的Application:
public class MyApplication extends Application{
private HttpClient httpClient;
public void onCreate(){
super.onCreate();
httpClient = this.createHttpClient();
}
public void onLowMemory(){
super.onLowMemory();
this.shutdownHttpClient();
}
public void onTerminamte(){
super.onTerminate();
this.shutdownHttpClient();
}
//创建HttpClient实例
private HttpClient createHttpClient(){
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setversion(params,HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params,HTTP.DEFAULT_CONTENT_CHARSET);
HttpProtocolParams.setUseExpectContinue(params,true);
SchemeRegistry schReg = new SchemeRegistry();
schReg.register(“http”,PlainSocketFactory.getSocketFactory(),80);
schReg.register(“https”,SSLSocketFatory.getSocketFactory(),443);
ClientConnectionManager connMgr = new ThreadSafeClientConnManager(params,schReg);
return new DefaultHttpClient(connMgr,params);
}
//关闭连接管理器并释放资源
private void shutdownHttpClient(){
if(httpClient != null && httpClient.getConnectionManager() != null){
httpClient.getConnectionManager().shutdown();
}
//对外提供HttpClient实例
public HttpClient getHttpClient(){
return httpClient;
}
}
在上述代码中重写了onCreate()方法,在系统启动时就创建一个HttpClient。
重写了onLowMemory()和onTerminate()方法,在内存不足和应用结束时关闭连接,释放资源。
需要注意的是,当实例化DefaultHttpClient时,传入一个由ThreadSafeClientConnManager创建的ClientConnectionManager实例,负责管理HttpClient的HTTP连接。
在文件AndroidManifest.xml中进行如下配置,目的是让“优化”版的Application生效。
<application android:name=”.MyApplication”…>…</application>
系统就会使用前面编写的MyApplication,然后就可以在context中调用getApplication()来获取MyApplication实例。
经过上面的“优化”处理配置,接下来就可以在活动中应用了
private void execute(){
try{
MyApplication app = (MyApplication) this.getApplication();
HttpClient client = app.getHttpClient();
HttpGet request = new HttpGet(“http://www.*****.com/test?id=***&name=****”);
HttpResponse response = client.execute(request);
if(response.getStatusLine.getStatusCode == HttpStatus.SC_OK){
InputStream is = response.getEntity().getContent();
String result = isStreamString(is);
Toast.makeText(this,result,Toast.LENGTH_LONG).show();
}
}catch(Exception e){
e.printStackTrace();
}
}
private String isStreamString(InputStream is) throws Exception{
ByteArrayOutputStream bo = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
int len = -1;
while((len = is.read(buf)) != -1){
bo.write(but,0,len);
}
return new String(bo.toByteArray());
}
尊重原创,转载请注明出处:http://blog.csdn.net/chillax_li/article/details/22078625
《Android开发卷——HTTP网络通信,HTTP网络连接》的更多相关文章
- 简单物联网:外网访问内网路由器下树莓派Flask服务器
最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...
- 利用ssh反向代理以及autossh实现从外网连接内网服务器
前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...
- 外网访问内网Docker容器
外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...
- 外网访问内网SpringBoot
外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...
- 外网访问内网Elasticsearch WEB
外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...
- 怎样从外网访问内网Rails
外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...
- 怎样从外网访问内网Memcached数据库
外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...
- 怎样从外网访问内网CouchDB数据库
外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...
- 怎样从外网访问内网DB2数据库
外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...
- 怎样从外网访问内网OpenLDAP数据库
外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...
随机推荐
- 通过 MSE 实现基于Apache APISIX的全链路灰度
简介: 无论是微服务网关还是微服务本身都需要识别流量,根据治理规则做出动态决策.当服务版本发生变化时,这个调用链路的转发也会实时改变.相比于利用机器搭建的灰度环境,这种方案不仅可以节省大量的机器成本和 ...
- 阿里云全站加速DCDN重磅升级
简介:相比传统CDN加速,全站加速DCDN具有更广阔的应用场景.在当下企业全面数字化的进程中,为了更全面地满足广大企业客户的个性化加速需求,全站加速DCDN从简单开通到个性化定制.从内容分发到安全防 ...
- MaxCompute 挑战使用SQL进行序列数据处理
简介: MaxCompute 挑战使用SQL进行序列数据处理 --而不是用MR和函数 日常编写数据加工任务,主要的方法就是使用SQL.第一是因为自己对SQL掌握的比较好(十多年数据开发经验,就这几个关 ...
- [Tools] Kali Linux 高清屏扩大系统字体、BurpSuite、OpenVAS
系统检索 Setting Manager,Appearance -> Settings,选择 Window Scaling:2x Terminal fonts: linux terminal 快 ...
- dotnet 读 WPF 源代码笔记 WriteableBitmap 的渲染和更新是如何实现
在 WPF 框架提供方便进行像素读写的 WriteableBitmap 类,本文来告诉大家在咱写下像素到 WriteableBitmap 渲染,底层的逻辑 之前我使用 WriteableBitmap ...
- 2019-8-31-C#-转换类型和字符串
title author date CreateTime categories C# 转换类型和字符串 lindexi 2019-08-31 16:55:58 +0800 2018-2-13 17:2 ...
- 【GUI开发】用python爬YouTube博主信息,并开发成exe软件!
目录 一.背景介绍 二.代码讲解 2.1 爬虫 2.2 tkinter界面 2.3 存日志 三.说明 一.背景介绍 你好,我是@马哥python说,一名10年程序猿. 最近我用python开发了一个G ...
- 06. C语言指针
[指针] C语言使用数据名调用数据,数据名相当于C语言的直接寻址,直接寻址只能调用固定数据,而指针是间接寻址,指针存储了另一个数据的地址,使用指针调用数据时首先取指针存储的内存地址,之后使用此地址调用 ...
- 记一次线上Redis内存占用过高、大Key问题的排查
问题背景 在一个风和日丽的下午,公司某项目现场运维同学反馈,生产环境3个Redis的Sentinel集群节点内存占用都很高,达到了17GB的内存占用量. 稍加思索,应该是某些Key的Value数据体量 ...
- Linux(四):Linux的打包和压缩详解
关于Linux的文件操作,这里汇总一下打包和压缩的一些命令,以及命令使用的详情. 打包(归档)和压缩 归档,也称为打包,指的是一个文件或目录的集合,而这个集合被存储在一个文件中.归档文件没有经过压缩, ...