原文出处:http://www.2cto.com/kf/201412/362765.html
1、背景介绍
我们在Activity和Fragment中做网络请求的时候,往往用到线程和handler消息处理机制等做处理。这里,我们将网络请求,一个get和一个post请求,使用线程封装一下。这样就剥离开了Activity中的代码量,将复杂的代码,封装在不同的类中,实现一个类的单一原则。
2、GET请求封装
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
/**
* GET提交的网络请求<br>
* <br>
* 传递过来主UI线程的消息处理器,经过线程处理之后,返回一个消息给主UI线程 <br>
* 在返回的msg信息中,what封装了返回的状态码信息 <br>
* 1001代表成功,404代表客户端请求错误,100代表IO处理错误 <br>
* <br>
* obj信息封装了请求的结果,返回值为String类型
*
* @author ljtyzhr
*
*/
public
class
HttpGetThread
implements
Runnable {
/** handler处理 */
private
Handler handler;
/** 网络请求地址 */
private
String url;
/**
* 使用Get提交的构造方法
*
* @param handler
* 消息对象
* @param url
* 请求的url地址
*/
public
HttpGetThread(Handler handler, String url) {
this
.handler = handler;
this
.url = url;
}
@Override
public
void
run() {
// 获取我们回调主ui的message
Message msg = handler.obtainMessage();
try
{
String result = HttpRequestUtils.doGet(url);
msg.what = ConstantValues.GET_NET_SUCCEED;
msg.obj = result;
}
catch
(ClientProtocolException e) {
msg.what =
404
;
}
catch
(IOException e) {
msg.what =
100
;
}
// 给主ui发送消息传递数据
handler.sendMessage(msg);
}
}
|
3、POST请求封装
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
/**
* POST提交的网络请求<br>
* <br>
* 传递过来主UI线程的消息处理器,经过线程处理之后,返回一个消息给主UI线程 <br>
* 在返回的msg信息中,what封装了返回的状态码信息 <br>
* 1001代表成功,404代表客户端请求错误,100代表IO处理错误 <br>
* <br>
* obj信息封装了请求的结果,返回值为String类型
*
* @author ljtyzhr
*
*/
public
class
HttpPostThread
implements
Runnable {
/** handler处理 */
private
Handler handler;
/** 网络请求地址 */
private
String url;
/**
* 使用post提交的构造方法
*
* @param handler
* 消息对象
* @param url
* 请求的url地址
*/
public
HttpPostThread(Handler handler, String url) {
this
.handler = handler;
this
.url = url;
}
@Override
public
void
run() {
// 获取我们回调主ui的message
Message msg = handler.obtainMessage();
try
{
String result = HttpRequestUtils.doPost(url);
msg.what = ConstantValues.GET_NET_SUCCEED;
msg.obj = result;
}
catch
(ClientProtocolException e) {
msg.what =
404
;
}
catch
(IOException e) {
msg.what =
100
;
}
// 给主ui发送消息传递数据
handler.sendMessage(msg);
}
}
|
4、使用方式
看到上面的参数信息,我们大致知道需要一些怎样的参数,这里简单介绍如何使用这两个封装类:
给出一个Get请求的实例:
1
2
|
HttpGetThread httpGetThread =
new
HttpGetThread(handler, url,
this
);
new
Thread(httpGetThread).start();
|
handler的处理机制:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
private
Handler handler =
new
Handler() {
public
void
handleMessage(android.os.Message msg) {
switch
(msg.what) {
case
ConstantValues.GET_NET_SUCCEED:
// 获取网络成功
jsonString = (String) msg.obj;
break
;
case
ConstantValues.GET_NET_FAILED:
// 获取网络失败
break
;
case
ConstantValues.DEL_RESULT_SUCCEED:
// 数据处理成功了,开始设置数据
break
;
case
ConstantValues.DEL_RESULT_FAILED:
// 字符串处理失败
theUrlErrorShow();
break
;
case
ConstantValues.THE_URL_ERROR:
// 字符串处理失败
Logger.ii(TAG,
"The url error!"
);
break
;
default
:
break
;
}
}
};
|
5、总结
在使用上面的网络请求封装类的时候,要注意两个问题:
第一、我们使用的网络请求中,需要传递当前的handler处理对象,用于接收我们的消息处理返回信息;内部的网络请求,get和post请求,这里不再赘述;
第二、我们使用的这个框架中,没有使用到Cookie处理机制,那么当我们做需要登录的请求的时候,需要使用Cookie处理。