本文主要内容
android-async-http用法
android-async-http主要流程
总结
1、android-async-http用法
android-async-http框架用于网络请求等,据说它已经不再维护,但个人感觉它还是很好用的,尤其是源码中的一些设计思路,值得我们学习。
它的使用较为简单,如果是Android studio,则需要在build.gradle中添加如下语句:
implementation 'com.loopj.android:android-async-http:1.4.9'
如果是Eclipse,添加jar包就行了,jar包可以到github上下载。
它的使用非常简单,我们以最简单的get请求为例:
private AsyncHttpClient mClient = new AsyncHttpClient();
private String URL = "http://httpbin.org/get";
mClient.get(getActivity(), URL, handler);
private AsyncHttpResponseHandler handler = new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] response) {
if (response != null) {
Log.i("okunu", "onSuccess response = " + new String(response));
}else {
Log.i("okunu", "onSuccess");
}
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] response, Throwable e) {
if (response != null) {
Log.i("okunu", "onFailure response = " + new String(response));
}else {
Log.i("okunu", "onFailure");
}
}
};
从代码上看,写相应的回调接口,并且将context以及url传入即可。需要注意的是,回调的接口有非常多的类型,需要根据服务器上返回的数据确定对应的类型,否则会出错。
android-async-http有两种类型的client,一种就是上文中用到的AsyncHttpClient ,另一种就是SyncHttpClient ,顾名思义,前一种是异步的,后一种是同步的,本文使用异步举例。
2、android-async-http主要流程
我们先来看看它的大致流程图:
调用AsyncHttpClient 的get方法后,其实是将请求封装成一个 Runnable 对象,并且向线程池中提交这个任务。最后调用回调接口,将结果返回到主线程中来。
其实,关于android-async-http内部更多的核心流程,没有更多的可说了,代码又简单又复杂,上述的核心原理非常简单,但更细节的,比如网络访问,代码太细了,一入代码深似海,头大。所以本文不再详细记叙了,不过有一点非常重要的是,它的核心机制我们可以学习。
记得在工作中遇到过一个问题,使用系统自带的DownloadManager下载文件,有概率出错,下载的文件不全。这就非常郁闷了,系统的代码我也改不了,所以当时就自己弄了一套下载工具,到今天来看,没想到和 android-async-http 原理一模一样,根据请求生成一个任务,将任务提交到线程池中运行,可以在下载任务中抽象出进度接口,开始和结束接口。
如果我们不是做一个大而全的网络模块,如果只应对单一类型的网络访问或者类型有限的网络访问,完全可以模仿 android-async-http,自己写一个工具,清晰又简单。
总结
多看多想多总结,大道至简,很多原理其实都是相通的,我们可以借鉴,学以至用,这是最关键的。