Android中网络请求一般使用Apache HTTP Client或者采用HttpURLConnect,但是直接使用这两个类库需要写大量的代码才能完成网络post和get请求,而使用android-async-http这个库可以大大的简化操作,它是基于Apache’s HttpClient ,所有的请求都是独立在UI主线程之外,通过回调方法处理请求结果,采用android Handler message 机制传递信息。在 iOS开发中有大名鼎鼎的ASIHttpRequest库,用来处理网络请求操作,今天要介绍的是一个在Android上同样强大的网络请求库android-async-http(官方网址:https://loopj.com/android-async-http/),目前非常火的应用Instagram和Pinterest的Android版就是用的这个网络请求库。这个网络请求库是基于Apache HttpClient库之上的一个异步网络请求处理库,网络处理均基于Android的非UI线程,通过回调方法处理请求结果。
dependencies { compile 'com.loopj.android:android-async-http:1.4.9' }
AsyncHttpClient asyncHttpClient= new AsyncHttpClient();
private void asyncGetMethod() { asyncHttpClient.get(url, new AsyncHttpResponseHandler() {//接收请求结果,一般重写onSuccess及onFailure接收请求成功或失败的消息,还有onStart,onFinish等消息 @Override public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { // called when response HTTP status is "200 OK" if(statusCode==200){ // Log.e("dy",new String(responseBody)); Bitmap bitmap = BitmapFactory.decodeByteArray(responseBody, 0, responseBody.length); imageView.setImageBitmap(bitmap);//回调发生在创建它的线程中 } } @Override public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) { // called when response HTTP status is "4XX" (eg. 401, 403, 404) } }); }
private void asyncGetMethodWithParams() { params = new RequestParams(); params.put("key","ce3ed11412e24cb9ac909a54ba8fbbd1"); params.put("company","zhongtong"); params.put("id","719235004847"); asyncHttpClient.get(url2,params,new TextHttpResponseHandler() { @Override public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) { } @Override public void onSuccess(int statusCode, Header[] headers, String responseString) { textView.setText(responseString); } }); }
TextHttpResponseHandler,其继承自AsyncHttpResponse,并将原生的字节流根据指定的encoding转化成了string对象。同样的方式,你可以发送json请求,代码如下:
private void sendJsonRequest() { params=new RequestParams(); params.put("key","ce3ed11412e24cb9ac909a54ba8fbbd1"); params.put("company","zhongtong"); params.put("id","719235004847"); asyncHttpClient.get(url2,params,new JsonHttpResponseHandler(){ @Override public void onSuccess(int statusCode, Header[] headers, JSONObject response) { // Handle resulting parsed JSON response here try { Log.e("dy",response.getString("result")); } catch (JSONException e) { e.printStackTrace(); } } }); }
public class MyHttpClient { private static final String BASE_URL="http://api.avatardata.cn"; 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; } }
private void staticHttpClient() { params=new RequestParams(); params.put("key","ce3ed11412e24cb9ac909a54ba8fbbd1"); params.put("company","zhongtong"); params.put("id","719235004847"); MyHttpClient.get(url2,params,new JsonHttpResponseHandler(){ @Override public void onSuccess(int statusCode, Header[] headers, JSONObject response) { // If the response is JSONObject instead of expected JSONArray try { String error = response.getString("result"); textView.setText(error); } catch (JSONException e) { e.printStackTrace(); } } }); }
上述源码下载:源码
调用AsyncHttpClient的get或post等方法发起网络请求所有的请求都走了sendRequest,在sendRequest中把请求封装为了AsyncHttpRequest,并添加到线程池执行当请求被执行时(即AsyncHttpRequest的run方法),执行AsyncHttpRequest的makeRequestWithRetries方法执行实际的请求,当请求失败时可以重试。并在请求开始,结束,成功或失败时向请求时传的ResponseHandlerInterface实例发送消息基本上使用的都是AsyncHttpResponseHandler的子类,调用其onStart,onSuccess等方法返回请求结果