上篇提到Volley的使用,但在实际开发中,会发现android在UI线程以外进行ui操作是会报操作的,查阅资料发现,android解决该问题的方法是异步任务处理或多线程处理的方式
但用过的人都知道,两者都有冗余且较长的代码量,每一次网络请求图片需要开启新线程的话未免也太繁琐了,于是又发现了一个神器的框架AsyncHttpClient
老样子先上github地址:https://github.com/loopj/android-async-http/
1.AsyncHttpClient的特性
-
发送异步http请求,在匿名callback对象中处理response信息;
-
http请求发生在UI(主)线程之外的异步线程中;
-
内部采用线程池来处理并发请求;
-
通过RequestParams类构造GET/POST;
-
内置多部分文件上传,不需要第三方库支持;
-
文件很小;
-
内置多种形式的响应解析,有原生的字节流,string,json对象,甚至可以将response写到文件中;
-
永久的cookie保存,内部实现用的是Android的SharedPreferences;
-
通过BaseJsonHttpResponseHandler和各种json库集成;
-
支持SAX解析器;
-
支持各种语言和content编码,不仅仅是UTF-8;
2.基本使用之官方推荐封装
public class TwitterRestClient {
private static final String BASE_URL = "http://api.twitter.com/1/";
private static AsyncHttpClient client = new AsyncHttpClient();
public static void get(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) {
client.get(getAbsoluteUrl(url), params, responseHandler);
}
public static void post(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) {
client.post(getAbsoluteUrl(url), params, responseHandler);
}
private static String getAbsoluteUrl(String relativeUrl) {
return BASE_URL + relativeUrl;
}
}
RequestParams params = new RequestParams();
params.put("username", "yanbober");
params.put("password", "123456");
params.put("email", "yanbobersky@email.com");
//支持文件,常见数据结构的参数上传,读者可自行查阅
4.JsonHttpResponseHandler的使用
client.post(url, params,new JsonHttpResponseHandler(){
@Override
public void onSuccess(JSONObject jsonObject) {
//获取的jsonObject可自行解析
}
});
AsyncHttpRequest继承自Runnable,是基于线程的子类,用于异步请求类, 通过AsyncHttpResponseHandler回调。所以可在回调中直接进行UI操作,但长时
间的请求可能会出现一些错误