android-async-http源码剖析

96
某昆
2018.08.25 16:58* 字数 747

本文主要内容

  • 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,自己写一个工具,清晰又简单。

总结

多看多想多总结,大道至简,很多原理其实都是相通的,我们可以借鉴,学以至用,这是最关键的。

Android日记
Web note ad 1