【转】 Pro Android学习笔记(六七):HTTP服务(1):HTTP GET
Andriod应用可利用service提供很多功能,例如利用Google Maps API,现在我们将聚焦在HTTP serice中。
Android SDK提供HttpClient,和J2EE中的接口非常相似。最常用的就是HTTP GET和HTTP POST。相关内容也可以阅读Android学习笔记(四五):互联网通信-HttpClient、XML解析(W3C)。
HTTP GET小例子
因为要访问互联网,所以要在AndriodManifest.xml文件中加入android.permission.INTENT的权限。
简单小例子
小例子很简单,发送一个HTTP Get,请求打开某个网址,并将收到的HTTP响应通过Log打印出来。
public class HttpGetDemo extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
BufferedReader in = null;
try{
//【Step 1】创建一个HttpClient的对象(或使用已有的)
HttpClient client = new DefaultHttpClient();
//【Step 2】实例化一个HTTP GET或者HTTP POST,本例是HTTP GET
HttpGet request = new HttpGet("http://www.baidu.com");
//【Step 3】设置HTTP参数,本例子是最简单地打开某个网址的HTTP GET,无需设置
//【Step 4】通过HttpClient来执行HTTP call(发出HTTP请求)
HttpResponse response = client.execute(request);
//【Step 5】处理HTTP响应,本例将整个响应的内容(HTTP 200消息的body)都在String中。
in = new BufferedReader(
new InputStreamReader(
response.getEntity().getContent()));
StringBuffer buff = new StringBuffer("");
String line = "";
String NL = System.getProperty("line.separator"); //实际上就是“\n”,可自动适配系统的换行符。
while((line = in.readLine()) != null ){
buff.append(line + NL);
}
in.close();
Log.d("PRO",buff.toString());
}catch(Exception e){
e.printStackTrace();
Log.d("PRO",e.toString());
}finally{ //try{}catch(){}finally{}中finally见得稍微少,但是很有用,无论是否有异常,都会执行finally的代码,常用于xx.close()。
if(in != null){
try{
in.close(); //关闭BufferedReader,同时也关闭了底层的HTTP connection
}catch(Exception e){
e.printStackTrace();
Log.d("PRO","error in finally:\n" + e.toString());
}
}
}
}
}
出现异常NetworkOnMainThreadException
这是很简单的例子,但是运行的时候却报错:

例子很简单,代码没有什么为题,何故?根据文档,这个错误会在应用尝试在主线程(Main)中进行网络操作而产生,只在Honeycomb SDK或更高版本出现。也就是说在Android 3.0及以上版本,如果在主线程进行网络访问,会扔出NetworkOnMainThreadException。而检查AndroidManifest.xml文件,发现:
<uses-sdk android:minSdkVersion="14" …… />
即运行在Android 4.0及以上的版本。Android 3.0对应为API level 10,我们只需简单地改为:
<uses-sdk android:minSdkVersion="9" />
Android这样的处理是有道理的,我们注意到代码当中有一行:
/* 建立HTTP的TCP连接(包括之前对网址的DNS解析),发送HTTP GET请求,等待HTTP response消息。这一语句执行了太多内容,有些步骤,可能会因为网络问题,出现长时间的等待才能连接到(或最终不能连接)网站。因此这语句的执行时间可能会很长,建议放在线程中进行后台处理,而不是主线程(同时也是UI线程)中,否则会造成activity因执行该语句造成的UI无响应问题。另外如果网页很大,需要读取很久,在main thread会由于执行该语句导致UI暂时无响应(我不太确定读取网页是在execute,还是在后面in中作为流的方式读取读取,但是我倾向于在execute中读完,因为已经获得HttpResponse对象)*/
HttpResponse response = client.execute(request);
通过StrictMode进行处理
对NetworkOnMainThreadException的合理处理就是将网络访问放置在线程中,本例为了演示直接放置在activity中,在正常情况下,不应如此处理。
处理修改API Level之外,要避免异常,同时也需要指定最小运行版本在Android 3.0以上,例如本例最初指定android:minSdkVersion="14"。还可以对代码进行以下处理:
……
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
……
BufferedReader in = null;
try{ … }catch(Exception e){ … }finally{…}
StrictMode我们在Pro Android学习笔记(五五):调试和分析(3):adb命令、模拟器控制台和StrictMode中介绍过,不禁止运行线程的某些策略,上面的代码不做任何策略检查,当然也可以只放开网络,即也可以用permitNetwork()。
相关的参考BUG处理可参见:http://www.lucazanini.eu/2012/android/the-android-os-networkonmainthreadexception-exception/?lang=en
当然,我们应该明白尽量不要在activity中(main thread)有网络访问代码。
URL带键值对
对于CGI,URL是带有键值对的,最常见的就是搜索网站,网站根据URL携带的信息来确定用户所要搜索的内容。例如:
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet("http://www.google.com.hk/#newwindow=1&q=android&safe=strict");
HttpResponse response = client.execute(request);
更多的可以使用HTTP POST方式,我们将继续学习。
本博文涉及的例子代码,可以在Pro Android学习:Http service小例子中下载。
相关链接: 我的Android开发相关文章
【转】 Pro Android学习笔记(六七):HTTP服务(1):HTTP GET的更多相关文章
- 【转】 Pro Android学习笔记(七六):服务(1):local和remote
文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ Android提供服务,服务是运行在后台的 ...
- 【转】 Pro Android学习笔记(七八):服务(3):远程服务:AIDL文件
目录(?)[-] 在AIDL中定义服务接口 根据AIDL文件自动生成接口代码 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.n ...
- 【转】 Pro Android学习笔记(七九):服务(4):远程服务的实现
目录(?)[-] 远程服务的实现小例子 对外开放远程服务的接口 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flow ...
- 【转】 Pro Android学习笔记(七四):HTTP服务(8):使用后台线程AsyncTask
目录(?)[-] 5秒超时异常 AsyncTask 实现AsyncTask抽象类 对AsyncTask的调用 在哪里运行 其他重要method 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注 ...
- 【转】 Pro Android学习笔记(七五):HTTP服务(9):DownloadManager
目录(?)[-] 小例子 保存在哪里下载文件信息设置和读取 查看下载状态和取消下载 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件,转载须注明出处:http://blog.csd ...
- 【转】 Pro Android学习笔记(七十):HTTP服务(4):SOAP/JSON/XML、异常
目录(?)[-] SOAP JSON和XMLPullParser Exception处理 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件,转载须注明出处:http://blog. ...
- 【转】 Pro Android学习笔记(七二):HTTP服务(6):HttpURLConnection
目录(?)[-] Http Get的使用方式 基础小例子 Cookie的使用 重定向 HTTP POST的小例子 基础小例子 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件,转载 ...
- 【转】Pro Android学习笔记(七):了解Content Provider(下上)
我们通过一个Content Provider小例子进行详细说明.数据源是一个SQLite数据库,名字为books.db,该数据库只含有一个表格,名字为books.表格中含有name,isbn,auth ...
- 【转】 Pro Android学习笔记(七三):HTTP服务(7):AndroidHttpClient
文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件,转载须注明出处:http://blog.csdn.net/flowingflying/ 不知道此文是否是这个系列中最短的一篇.我们 ...
随机推荐
- 【python】-- 深浅copy、集合
深浅copy 1.数字.字符串的copy: 赋值(=).浅拷贝(copy)和深拷贝(deepcopy)其实都一样,因为它们永远指向同一个内存地址: >>> import copy & ...
- 初识机器学习之kNN算法
k近邻(k-Nearest Neighbor,简称kNN)学习是一种常用的监督学习方法,其工作机制非常简单:给定测试样本,基于某种距离度量找出训练集中与其最靠近的k个训练样本.然后基于这k个“邻居”的 ...
- C# unicode GBK UTF-8和汉字互转
界面: 源码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Da ...
- 读:Instance-aware Image and Sentence Matching with Selective Multimodal LSTM
摘要:有效图像和句子匹配取决于如何很好地度量其全局视觉 - 语义相似度.基于观察到这样的全局相似性是由图像(对象)和句子(词)的成对实例之间的多个局部相似性的复合聚集,我们提出了一个实例感知图像和句子 ...
- overflow-y:auto 回到顶部
overflow-y 内容溢出元素框时发生的事情. overflow-y:auto 内容溢出元素框时自动出现滚动条,滑动滚动条显示溢出的内容. 滚动条回到顶部 var conta ...
- PullToRefresh下拉刷新
https://github.com/chrisbanes/Android-PullToRefresh
- mysql sql语句:行转列问题
存在表score,记录学生的考试成绩,如下图所示: 现要求以 学生姓名,语文,数学,英语 这种格式显示学生成绩,如下图所示 具体步骤如下: 1.首先,使用case when函数输出单个课程的成绩 ca ...
- linux操作系统使用中的一些总结
VIM常用命令 gg //到第一行 (N)G //到第n行(N为整数) G //到最后一行 0 //到行头 $ //到行尾 (N)dd //删除N行,并将内容保存到粘贴板 p ...
- mysql 数据库备份方案及策略
由于mysql存在多种数据库备份方式,而且各有利弊,对于我们初学者来说,选择合适的备份方式确实有些困难.个人觉得,首先要基于公司的需求,考虑能够容忍丢失多少数据.花多少人力时间成本等,这是我们制定备份 ...
- nova 为何要做互信
1.计算节点为什么要做nova 的互信? nova 做resize 或者冷迁移需要两台计算节点做互信. 原因:resize(冷迁移)实际上是运行scp 文件到另一台主机上,如下的命令 Command: ...