我们在Activity和Fragment中做网络请求的时候,往往用到线程和handler消息处理机制等做处理。这里,我们将网络请求,一个get和一个post请求,使用线程封装一下。这样就剥离开了Activity中的代码量,将复杂的代码,封装在不同的类中,实现一个类的单一原则。
/**
* 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);
}
}
/**
* 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);
}
}
看到上面的参数信息,我们大致知道需要一些怎样的参数,这里简单介绍如何使用这两个封装类:
给出一个Get请求的实例:
HttpGetThread httpGetThread = new HttpGetThread(handler, url, this); new Thread(httpGetThread).start();
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;
}
}
};在使用上面的网络请求封装类的时候,要注意两个问题:
第一、我们使用的网络请求中,需要传递当前的handler处理对象,用于接收我们的消息处理返回信息;内部的网络请求,get和post请求,这里不再赘述;
第二、我们使用的这个框架中,没有使用到Cookie处理机制,那么当我们做需要登录的请求的时候,需要使用Cookie处理。
原文地址:http://blog.csdn.net/ljtyzhr/article/details/42005313