9.1网络编程入门
9.1.1HTTP协议简介
HTTP协议即超文本传输协议,它规定了浏览器和万维网服务器之间互相通信的规则。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2YfNWawNCM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TP35UeZRlT3dGVOBDOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZwpmLwkTMzEDNyMjM5AjMwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
- 一次HTTP请求的过程:建立连接;发送请求;处理请求;返回数据;发送请求2……关闭连接
- HTTP请求的常用方式:GET;POST
- HTTP请求的格式:请求行;请求头;请求体
- HTTP响应的格式:响应行(包含响应码:200 404 500 302);响应头;响应体
9.1.2使用HTTPConnection
1.URL:包含请求地址的类
- URL(path):包含请求路径的构造方法
- openConnection():得到连接对象
2.HttpURLConnection:代表与服务器连接的类
- setRequestMethod(“GET/POST”):设置请求方式
- setDoInput(true/false):设置可以读取服务器端返回的数据
- setDoOutput(true/false):设置可以向服务器端写入数据
- setConnectTimeout(time):设置连接超时时间,单位为ms
- setReadTimeout(time):设置读取服务器返回数据的时间
- connect():连接服务器
- int getResponseCode():得到服务器返回的结果码
- int getContentLength():得到服务器返回数据的长度(字节)
- getOutputStream():返回一个指向服务器端的数据输出流
- getInputStream():返回一个从服务器端返回的数据输入流
- disconnect():断开连接
9.1.3Handler
- Handler主要用于发送消息和处理消息。一般使用Handler对象的sendMessage()方法发送消息,消息经过一系列处理后,最终会传递到Handler的handlerMessage()方法中。
- 发送及时消息:sendMessage(Message msg)
- 发送延时消息:sendMessageDelayed(Message msg,long time)
- 处理消息:handleMessage(Message msg)(回调方法)
- 移除还未处理的消息:removeMessages(int what)
9.1.4Handler消息机制
Handler消息处理首先需要在UI线程创建一个Handler对象,然后在子线程中调用Handler的sendMessage()方法,接着这个消息会存放在UI线程的MessageQueue中,通过Looper对象取出MessageQueue中的消息,最后分发回Handler的handleMessage()方法中。
1.MessageQueue
- MessageQueue是消息队列的意思,它主要用来存放通过Handler发送的消息。通过Handler发送的消息会存在MessageQueue中等待处理。它是一个按Message的when排序的优先级队列。(when:代表着被处理的时间)
2.Looper
- Looper是每个线程中的MessageQueue的管家。调用Looper的loop()方法后,就会进入到一个无线循环中。然后一发现MessageQueue中存在一条消息,就会将他取出,并传递到Handler的HandlerMessage()方法中。
使用Handler的一般步骤
1.创建Handler成员变量对象,并重写其handleMessage()
2.在分/主线程创建Message对象
3.使用handler对象发送Message
4.在handleMessage()中处理消息
9.1.5AsyncTask
- 为了方便子线程中对UI进行操作,Android提供了一些好用的工具类,AsyncTask就是其中之一。借助AsyncTask,可以十分简单地从子线程切换到主线程,它的原理也是基于异步消息处理机制的。
- AsyncTask是一个抽象类,它有三个泛型参数,分别如下
- Params:执行异步任务时需要传入的参数,用于在后台任务中使用;
- Progress:后台任务执行时,如果需要在界面上显示当前的进度,则使用该参数作为进度单位;
- Result:当任务执行完毕后,如果需要对结果进行返回时,则使用该参数作为返回值类型。
9.2.1HttpURLConnection的基本用法
在实际开发中,绝大多数的App都需要与服务器进行数据交互,此时就需要用到HttpURLConnection,他是一个标准的java类。需要注意的是,在使用HttpURLConnection对象访问网络时,需要设置超时时间,在网络异常的情况下,会取不到数据面而一直等待导致程序僵死不往下执行。
9.3数据提交方式
9.4.1GET方式和POST方式提交数据
- HTTP/1.1协议中共定义了八种方法来表明Request-URI指定的资源的不同操作方式。其中最常用的两种请求方式是GET和POST。
- GET方式与POST方式的区别
- GET方式以实体的方式得到由请求URL所指向的资源信息,向服务器提交的参数跟在请求URL后面。使用GET方式访问网络URL的长度是有限制的,请求URL的长度要小于1K。
- POST方式用来向目的的服务器发出请求,要求它接受被附在请求后的实体。他向服务器提交的参数在请求后的实体中,POST方式对URL的长度是没有限制的。
9.4JSON
什么是JSON?
- JSON是一种轻量级的数据交换格式
- 客户端(浏览器端)与服务器端交互:xml ison
- 本质就是具有特定格式的字符串
- JSON数据已经是客户端与服务器端交互的最常用的选择,已经很少使用xml来进行数据交互了
JSON数据格式
- 整体结构:String json1="{“id”:12,“name”:“Tom”}";String json2="[{“id”:12,“name”:“Tom”},{“id”:12,“name”:“Tom”}]";
- Json数组:[] ArrayList
- Json对象:{} HashMap
- Json数组的结构:[value1,value2,value3]
- Json对象的结构:{key1:value1,key2:value2,key3:value}
- key的数据类型:字符串
- value的数据类型:
- 数值(包含整数和小数)
- 字符串;null
- json数组[]String jsonArr="[value1,value2,value3,value4]";"[1,2,3]"
- json对象{}String jsonObject="{key1:value1,key2:value2,key3:value3}";
JSON数据解析
- 解析技术
- Android原生API:编程相对麻烦
- Gson框架:编码简洁,项目首选
- 解析方向
- 服务器端:将java对象(包含集合)转换为json格式字符串
- 客户端:将json格式字符串转换为java对象(包含集合)
相关API
- Android原生API:
- JsonObject类:json对象{}
- JsonObject( String json):将json字符串解析为json对象
- Xxx getXxx(String name):根据name,在json对象中得到对应的 Value
- JsonArray类:json数组[]
- JSONArray(String json):将json字符串解析为json数组
- int length():得到json数组中元素的个数
- Xxx getXxx(int index):根据下标得到json数组中对应的元素数据
- Gson框架API
- Gson:能解析son数据的类
- Gson():构造对象的方法
- String to]son(Object src):将对象转换为对应格式的json字符串
- T fromJson(String json,Type typeOfT):解析Json字符串,得到对象TypeToken<T>:用来得到Type的类
- protected TypeToken0:受保存的构造方法
- Type getType():得到类型对象
9.5开源项目
AsyncHttpClient的使用
- 在 Android开发中,发送、处理HTTP请求十分常见,如果每次与服务器进行数据交互都需要去开启一个子线程,这样是非常麻烦的。为了解决这个问题,一些开发者开发出了开源项目AsyncHttpClient。
- AsyncHttpClientl是对 HttpClient的再次包装AsyncHttpClient的特点有,发送异步HTTP请求、HTTP请求发生在UI线程之外、内部采用了线程池来处理并发请求,而且它使用起来比 HttpClient更加简便。