Android 开发之异步网络请求(AsyncHttp开发)
2016-07-22 16:30
621 查看
我们在Android开发中,经常会用到Http进行请求数据.首先,在java中用的Http分为Httpclient和Httpconnection,在net中经常用ajax去请求数据,基本都是用了回调的机制。
今天,我要讲的是利用Async http client 这套框架如何去请求数据。
我用的是as开发,毕竟Google也是推荐使用它,eclipse使用起来也没那么方便。
那么我们快进入正题吧!
如何配置这套框架?
第一步:在应用程序的build.gradle里进行引用框架
compile 'com.loopj.android:android-async-http:1.4.6' (注:上面是最简单的配置方法,我们还可以通过下载jar包,然后点击菜单栏>file>Project Structure>app>denpendence>点击"+"号,选择library 把项目的jar包加入,这样也是一种引用jar包的方式。在eclipse里是点击build path来依赖jar包,和开发j2ee是一样用的)
这时,我们已经把jar引用进来了,也就是我们可以使用别人的方法就可以使用啦!但是如果就这么结束了,是不是欠妥?在要请求了,总是一味的无脑调方法,是否考虑到代码的简洁,后期的维护性,方便后来维护的人看代码?
第二步:我们可以点击进入jar包查看源码
首先,我们可以想一想,在我们日常的http请求中主要就分为那几种请求方式:post(),put(),get(),还有关于文件的上传和下载。哦!原来是有这么多的请求方式在里面。那我就ctrl+f去搜索一下当前的class中的这些方法。这些请求方法普遍都用到了RequstHandle打头定义的方法和内部的ResponseHandlerInterface接口。这里的意思就是说我们在源码里看到的RequestHandle是怎么用得?我们用客户端发送一个请求给服务端,Request到RequestHandle再调用内部接口去实现返回json数据,ResponseHandleInterface里面又有onSuccess和OnFaliure方法。这里我们看到了重点,是什么?也是我很有收获的地方
4000
就是自定义回调的接口然后在宿主中实现,达到了回调的机制。因此,我们也可以模仿着写写,就是类似于我在做net
mvc开发的时候用的controller一样,起到一个控制的作用。在用的时候,传对应的参数过去,直接调用jar中的方法。这样不就极大的减少了代码量,也能快速的开发啦,如果加上自定义的注解那是更快!!!
废话不多说我们先自定义两个接口,代码如下:
用于普通的
public interface <span style="color:#ff0000;">ApiCallBack</span> {
public void onSuccess(int statusCode, Header[] headers, byte[] response);
public void onFailure(int statusCode, Header[] headers,
byte[] responseBody, Throwable error) throws JSONException;
}用于文件的
public interface <span style="color:#ff0000;">ApiFileUploadCallBack</span> {
public void onSuccess(int statusCode, Header[] headers, File file);
public void onFailure(int statusCode, Header[] headers, Throwable error, File file);
}
接着我们自定义一个类去把这些get(),post(),put(),uploadFile()方法放进去,这个自定义类里就是用于请求的,其中把header头信息的方法,超时方法都放进去,这样就有利于后期的维护和开发。代码如下:
public class <span style="color:#ff0000;">CustomHttpClient</span> {
AsyncHttpClient client = new AsyncHttpClient();
public CustomHttpClient() {
super();
}
public CustomHttpClient(AsyncHttpClient client) {
super();
this.client = client;
settingClientHeader();
}
public void setTimeOut() {
client.setTimeout(6000000);
}
public void addheader(String key, String value) {
client.addHeader(key, value);
}
private void settingClientHeader() {
client.addHeader("Content-Type", "application/json;charset=utf-8");
client.addHeader("Accept-Language", "zh-cn,zh;q=0.5");
}
public void cancleHttpRequest() {
client.cancelAllRequests(true);
}
public RequestHandle doGet(String url, final ApiCallBack callBack) {
return client.get(url, new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
callBack.onSuccess(statusCode, headers, responseBody);
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
try {
callBack.onFaliure(statusCode, headers, responseBody, error);
} catch (JSONException e) {
e.printStackTrace();
}
}
});
}
public RequestHandle doPost(String url, RequestParams params, final ApiCallBack callBack) {
return client.post(url, params, new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
callBack.onSuccess(statusCode, headers, responseBody);
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
try {
callBack.onFaliure(statusCode, headers, responseBody, error);
} catch (JSONException e) {
e.printStackTrace();
}
}
});
}
public RequestHandle doEntityPost(Context context, String url, HttpEntity entity, String contentType, final ApiCallBack callBack) {
return client.post(context, url, entity, contentType, new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
callBack.onSuccess(statusCode, headers, responseBody);
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
try {
callBack.onFaliure(statusCode, headers, responseBody, error);
} catch (JSONException e) {
e.printStackTrace();
}
}
});
}
public RequestHandle doDelete(String url, final ApiCallBack callBack) {
return client.delete(url, new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
callBack.onSuccess(statusCode, headers, responseBody);
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
try {
callBack.onFaliure(statusCode, headers, responseBody, error);
} catch (JSONException e) {
e.printStackTrace();
}
}
});
}
public RequestHandle doPut(String url, RequestParams params, final ApiCallBack callBack) {
return client.put(url, params, new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
callBack.onSuccess(statusCode, headers, responseBody);
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
try {
callBack.onFaliure(statusCode, headers, responseBody, error);
} catch (JSONException e) {
e.printStackTrace();
}
}
});
}
public RequestHandle UpLoadFile(Context context, String url, RequestParams params, final ApiFileUploadCallBack fileCallBack) {
return client.post(url, new FileAsyncHttpResponseHandler(context) {
@Override
public void onFailure(int statusCode, Header[] headers, Throwable error, File file) {
fileCallBack.onFailure(statusCode, headers, error, file);
}
@Override
public void onSuccess(int statusCode, Header[] headers, File file) {
fileCallBack.onSuccess(statusCode, headers, file);
}
@Override
public boolean deleteTargetFile() {
return super.deleteTargetFile();
}
@Override
protected File getTargetFile() {
return super.getTargetFile();
}
});
}
}
其中的callback.onSuccess()等方法就实现了回调机制。
今天,我要讲的是利用Async http client 这套框架如何去请求数据。
我用的是as开发,毕竟Google也是推荐使用它,eclipse使用起来也没那么方便。
那么我们快进入正题吧!
如何配置这套框架?
第一步:在应用程序的build.gradle里进行引用框架
compile 'com.loopj.android:android-async-http:1.4.6' (注:上面是最简单的配置方法,我们还可以通过下载jar包,然后点击菜单栏>file>Project Structure>app>denpendence>点击"+"号,选择library 把项目的jar包加入,这样也是一种引用jar包的方式。在eclipse里是点击build path来依赖jar包,和开发j2ee是一样用的)
这时,我们已经把jar引用进来了,也就是我们可以使用别人的方法就可以使用啦!但是如果就这么结束了,是不是欠妥?在要请求了,总是一味的无脑调方法,是否考虑到代码的简洁,后期的维护性,方便后来维护的人看代码?
第二步:我们可以点击进入jar包查看源码
首先,我们可以想一想,在我们日常的http请求中主要就分为那几种请求方式:post(),put(),get(),还有关于文件的上传和下载。哦!原来是有这么多的请求方式在里面。那我就ctrl+f去搜索一下当前的class中的这些方法。这些请求方法普遍都用到了RequstHandle打头定义的方法和内部的ResponseHandlerInterface接口。这里的意思就是说我们在源码里看到的RequestHandle是怎么用得?我们用客户端发送一个请求给服务端,Request到RequestHandle再调用内部接口去实现返回json数据,ResponseHandleInterface里面又有onSuccess和OnFaliure方法。这里我们看到了重点,是什么?也是我很有收获的地方
4000
就是自定义回调的接口然后在宿主中实现,达到了回调的机制。因此,我们也可以模仿着写写,就是类似于我在做net
mvc开发的时候用的controller一样,起到一个控制的作用。在用的时候,传对应的参数过去,直接调用jar中的方法。这样不就极大的减少了代码量,也能快速的开发啦,如果加上自定义的注解那是更快!!!
废话不多说我们先自定义两个接口,代码如下:
用于普通的
public interface <span style="color:#ff0000;">ApiCallBack</span> {
public void onSuccess(int statusCode, Header[] headers, byte[] response);
public void onFailure(int statusCode, Header[] headers,
byte[] responseBody, Throwable error) throws JSONException;
}用于文件的
public interface <span style="color:#ff0000;">ApiFileUploadCallBack</span> {
public void onSuccess(int statusCode, Header[] headers, File file);
public void onFailure(int statusCode, Header[] headers, Throwable error, File file);
}
接着我们自定义一个类去把这些get(),post(),put(),uploadFile()方法放进去,这个自定义类里就是用于请求的,其中把header头信息的方法,超时方法都放进去,这样就有利于后期的维护和开发。代码如下:
public class <span style="color:#ff0000;">CustomHttpClient</span> {
AsyncHttpClient client = new AsyncHttpClient();
public CustomHttpClient() {
super();
}
public CustomHttpClient(AsyncHttpClient client) {
super();
this.client = client;
settingClientHeader();
}
public void setTimeOut() {
client.setTimeout(6000000);
}
public void addheader(String key, String value) {
client.addHeader(key, value);
}
private void settingClientHeader() {
client.addHeader("Content-Type", "application/json;charset=utf-8");
client.addHeader("Accept-Language", "zh-cn,zh;q=0.5");
}
public void cancleHttpRequest() {
client.cancelAllRequests(true);
}
public RequestHandle doGet(String url, final ApiCallBack callBack) {
return client.get(url, new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
callBack.onSuccess(statusCode, headers, responseBody);
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
try {
callBack.onFaliure(statusCode, headers, responseBody, error);
} catch (JSONException e) {
e.printStackTrace();
}
}
});
}
public RequestHandle doPost(String url, RequestParams params, final ApiCallBack callBack) {
return client.post(url, params, new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
callBack.onSuccess(statusCode, headers, responseBody);
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
try {
callBack.onFaliure(statusCode, headers, responseBody, error);
} catch (JSONException e) {
e.printStackTrace();
}
}
});
}
public RequestHandle doEntityPost(Context context, String url, HttpEntity entity, String contentType, final ApiCallBack callBack) {
return client.post(context, url, entity, contentType, new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
callBack.onSuccess(statusCode, headers, responseBody);
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
try {
callBack.onFaliure(statusCode, headers, responseBody, error);
} catch (JSONException e) {
e.printStackTrace();
}
}
});
}
public RequestHandle doDelete(String url, final ApiCallBack callBack) {
return client.delete(url, new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
callBack.onSuccess(statusCode, headers, responseBody);
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
try {
callBack.onFaliure(statusCode, headers, responseBody, error);
} catch (JSONException e) {
e.printStackTrace();
}
}
});
}
public RequestHandle doPut(String url, RequestParams params, final ApiCallBack callBack) {
return client.put(url, params, new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
callBack.onSuccess(statusCode, headers, responseBody);
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
try {
callBack.onFaliure(statusCode, headers, responseBody, error);
} catch (JSONException e) {
e.printStackTrace();
}
}
});
}
public RequestHandle UpLoadFile(Context context, String url, RequestParams params, final ApiFileUploadCallBack fileCallBack) {
return client.post(url, new FileAsyncHttpResponseHandler(context) {
@Override
public void onFailure(int statusCode, Header[] headers, Throwable error, File file) {
fileCallBack.onFailure(statusCode, headers, error, file);
}
@Override
public void onSuccess(int statusCode, Header[] headers, File file) {
fileCallBack.onSuccess(statusCode, headers, file);
}
@Override
public boolean deleteTargetFile() {
return super.deleteTargetFile();
}
@Override
protected File getTargetFile() {
return super.getTargetFile();
}
});
}
}
其中的callback.onSuccess()等方法就实现了回调机制。
相关文章推荐
- Max(TM)仓库管理系统v2.0.5.1网络版
- 网络编程除了socket之外还有什么方式?
- 易流专线货运物流软件 V14.02 网络版
- Android 使用RxJava+Retrofit +Realm 组合加载数据 <读取缓存 显示 请求网络数据 缓存最新数据 更新界面>(二)
- Universal-Image-Loader,android-Volley,Picasso、Fresco和Glide五大Android开源组件加载网络图片的优缺点比较
- TCP协议的流量控制和拥塞控制
- NoHttp如何使用Https
- TCP/IP协议三次握手与四次握手流程解析
- Swift实时监听网络状态(更新到Swift3)
- Retrofit2.0使用小结
- 推荐10 个短小却超实用的 JavaScript 代码段(http://www.jianshu.com/p/3ef822ec5a63)
- 图论(网络流):[HNOI 2013]切糕
- 怎样提高程序员的软实力,走上人生巅峰(http://bbs.jointforce.com/topic/17845?ref=myread)
- NAT 原理与NAT穿越
- web缓存技术和HTTP代理
- 简明网络I/O模型---同步异步阻塞非阻塞之惑
- http--状态码
- java基础——用HttpURLConnection向服务器发送POST请求
- inet_ntoa()网络字节序IP转化为点分十进制IP
- 面试 之 大小端-ip地址网络转本地 等