您的位置:首页 > 理论基础 > 计算机网络

Android中的网络编程与handler,Json,HttpClient理解与使用

2013-04-11 10:39 489 查看
网络编程入门
HTTP协议简介
日常生活中,大多数人遇到了问题都会使用手机进行百度搜索,在浏览器的地址栏中输入百度的网址点击搜索,就会进入百度主页。这个访问百度的过程就是HTTP协议完成的,HTTP即超文传输协议,它规定了浏览器和服务器之间相互通信的规则,这里说的浏览器,既包括PC端浏览器,又包括移动端浏览器。
当客户端与服务器建立连接后,向服务器发送的请求,我们称之为HTTP请求。服务器接收到客户端请后并做出响应,我们称之为HTTP响应。
HTTP请求为分三部份:请求行,请求头,请求体/实体内容/正文内容
HTTP响应为分三部份:响应行,响应头,响应体/实体内容/正文内容
HTTPS

Handler消息机制原理
在Android4.0以后的版本中,不能在主线程(UI线程)中访问网络,子线程也不能更新UI界面,即
界面由主线程(UI线程)来更新,访问网络的工作交由子线程完成。这时就需要用到Handler消息机制来
实现主子线程之间的通信。
Handler消息机制中,关键有四个对象,我们需要理解其原理。
1——Message【重点】:
Messgae是在线程之间传送的消息,它可以在内部携带少量的信息,用于在不同线程之间
交换数据,Message的what子段表示携带了什么类型的信息,obj字段表示携带一个Object对象
2——Handler【重点】【重点】:
Handler就是消息处理者,它主要用于发送消息和处理消息。一般使用Handler对象
的sendMessage()方法发送消息,发出的消息经过一系列处理,最终会传递到Handler对象的handleMessage()方法中,再分门别类的处理
3——MessageQueue:
MessageQueue是消息队列的意思,它主要用来存放通过Handler.sendMessage()方法发送的消息,
通过Handler发送的消息会存入MessageQueue中等待处理,每个线程中只会有一个MessageQuery对象
4——Looper:
Looper是每个线程中的MessageQueue的管家,每当发现MessageQueue中存在一条消息,
就会将它取出,并传递到Handler的handleMessage()方法中。每个线程也只会有一个Looper对象。
一个线程只有一个MessageQueue对象,一个MessageQueue也只有一个Looper对象
8.2 使用HttpURLConnection访问网络
8.2.1 HttpURLConnection基本用法
在实际开发中,大多数的App都需要与服务器进行数据交互,这时我们可以使用Java标准类
HttpURLConnection来实现。
URL url = new URL(“http://www.baidu.com”);
HttpURLConnection conn= (HttpURLConnection)url.openConnection();
conn.setRequestMethod(“GET”);
conn.setConnectionTimeout(5000);如果不设置超时时间的话,在网络异常时,会取不到数据而一直等待
Int code = conn.getResponseCode();
//获取HTTP响应码,如果是200的话
InputStream is = conn.getInputStream();
try{
//读取流信息,获得服务器返回的数据
}catch(){
}
conn.disconnection();
注意:Android中,访问网络需要在android清单文件中配置权限:
<uses-permisstion android:name=”android.permission.INTERNET”/>
8.3 数据提交方式
8.3.1 GET方式和POST提交数据到服务器
1——GET方式
GET方式会将数据添加到URL后面,用?分隔,用&拼接每个请求参数,例如: http://127.0.0.1:8080/web/LoginServlet?id=2016&name=runsin&gender=male HTTP协议规定GET方式请求长度不超过4K,但IE规则GET方式请求长度不超过1K,
所以为了达到兼容,GET方式请求长度最多不超过1K,中文要编码
conn.setRequestMethod(“GET”);
2——POST方式
POST方式将数据隐藏在HTTP请求的实体中,以输入流的方式提交给服务器,相对GET来说,
POST方式请求长度是没有限制的,中文要编码
conn.setRequestMethod(“POST”);
conn.setRequestProperty(“content-type”,”application/x-www-form-urlencoded”);
conn.setRequestPropety(“content-length”,”100”);
conn.setDoOutput(true);
outputStream os = conn.getOutputStream();
os.write(data.getBytes(“UTF-8”));
int code = conn.getResponseCode();
if(code == 200){
//读取服务器返回的信息
}else{
//向主线程(UI线程)发送消息,让主线程(UI线程)显示出错提示给用户看
}
JSON解析
什么是JSON
有着特殊格式的普通字符串
为什么要用JSON,XML占用较多的带宽资源,速度慢,如果XML书写错误,会造成解析失败
项目中JSON用在哪
在服务器和移动客户端之间传递数据,通常是服务器将JSON传递给移动客户端,移动客户端再解析出JSON中有用的数据加以使用
移动客户端如何解析JSON
{}表示JSONObject对象
[]表示JSONArray对象
综合练习Android + JSON + JavaEE + MySQL
使用HttpClient访问网络
HttpClient基本用法
Android平台中,提供了三种网络接口,它们分别是:
》java.net.*(Java标准接口)
》org.apache.*(Apache接口)
》android.net.*(Android网络接口)
GET:
1_创建HttpClient对象
2_创建HttpGet对象
3_如果需要发送请求参数,可以直接将要发送的参数连接到URL后面,中文要编码
4_调用HttpClient对象的execute(HttpGet对象)方法发送请求,
返回值是一个HttpResponse对象
5_调用HttpResponse对象的getEntity()方法获取响应结果的HttpEntity对象
6_调用HttpEntity对象的方法获取结果,EntityUtils是一个不错的工具类
POST:
1_创建HttpClient对象
2_创建HttpPost对象
3_如果需要发送请求参数,
先将所有参数用List<NameValuePair> params = new ArrayList<NameValuePair>()封装,
再加入params.add(new BasicNameValuePair("country",country))中
最后调用setEntity(new UrlEncodedFormEntity(params,"UTF-8")进行编码
4_调用HttpClient对象的execute(HttpPost对象)方法发送请求,返回值是一个HttpResponse对象
5_调用HttpResponse对象的getEntity()方法获取响应结果的HttpEntity对象
6_调用HttpEntity对象的方法获取结果,EntityUtils是一个不错的工具类
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息