是时候开始重构Android Http网络层框架了(一个现代化的Http网络框架源码分析)

本文回顾了Android网络框架的发展历程,从早期的android-async-http到VolleyPlus,再到Retrofit+RxJava,最后介绍了最新的Net框架(基于okhttp+coroutines+lifecycle)。Net框架以其简洁、生命周期感知、协程同步等优点成为作者心中的最优解。文章深入探讨了各框架的特性和设计思想,并分析了Net框架的源码,展示了其结构和主要功能,鼓励开发者进行重构。
摘要由CSDN通过智能技术生成

横观历史

image.png

一点感概

记得当年刚入行Android,让我记忆犹新的框架android-async-http,当时用的不亦乐乎,随着时间的变迁,官方的新宠Volley诞生,不久的不久官方宣布自己放弃,坑爹,Android 4.4后,HttpURLConnection底层实现改为OkHttp,随即OkHttp是各个大牛封装的根基,Retrofit最为知名,可以说几乎没有人没用过,后来不知道谁刮起了RxJava大风,变成了Retrofit+RxJava+OkHttp,到目前为止我都很反感RxJava,框架固然很好,但我们不合适,不爱就是不爱,没必要牵强。自从有了Coroutines协程,算是找到了最优解,为什么这么说呢?我们先来分析下这几种实现方式

android-async-http

基于Apache的HttpClient库构建的Android异步网络框架,大致用法如下:

private AsyncHttpClient asyncHttpClient = new AsyncHttpClient() {

        @Override
        protected AsyncHttpRequest newAsyncHttpRequest(DefaultHttpClient client, HttpContext httpContext, HttpUriRequest uriRequest, String contentType, ResponseHandlerInterface responseHandler, Context context) {
            AsyncHttpRequest httpRequest = getHttpRequest(client, httpContext, uriRequest, contentType, responseHandler, context);
            return httpRequest == null
                    ? super.newAsyncHttpRequest(client, httpContext, uriRequest, contentType, responseHandler, context)
                    : httpRequest;
        }
    };

  @Override
    public RequestHandle executeSample(AsyncHttpClient client, String URL, Header[] headers, HttpEntity entity, ResponseHandlerInterface responseHandler) {
        return client.get(this, URL, headers, null, responseHandler);
    }

    @Override
    public String getDefaultURL() {
        return "https://httpbin.org/get";
    }

 @Override
    public ResponseHandlerInterface getResponseHandler() {
        return new AsyncHttpResponseHandler() {

            @Override
            public void onStart() {
                clearOutputs();
            }

            @Override
            public void onSuccess(int statusCode, Header[] headers, byte[] response) {
                debugHeaders(LOG_TAG, headers);
                debugStatusCode(LOG_TAG, statusCode);
                debugResponse(LOG_TAG, new String(response));
            }

            @Override
            public void onFailure(int statusCode, Header[] headers, byte[] errorResponse, Throwable e) {
                debugHeaders(LOG_TAG, headers);
                debugStatusCode(LOG_TAG, statusCode);
                debugThrowable(LOG_TAG, e);
                if (errorResponse != null) {
                    debugResponse(LOG_TAG, new String(errorResponse));
                }
            }

            @Override
            public void onRetry(int retryNo) {
                Toast.makeText(GetSample.this,
                        String.format(Locale.US, "Request is retried, retry no. %d", retryNo),
                        Toast.LENGTH_SHORT)
                        .show();
            }
        };
    }

我们暂且不提现在官方现在已经不用HttpClient,框架本身有很多可以借鉴的优秀设计,放在当初可谓是功能丰富,非常稳定,且bug极少。我少啰嗦几句,直接看下一个实现,最终我们再宏观的看看,到底网络框架的前世今生是什么走向。

VolleyPlus

VolleyPlus库对Volley进行的项目改进以及完整的图像缓存,涉及使用RequestQueue,RequestTickle和Request

RequestQueue mRequestQueue = Volley.newRequestQueue(getApplicationContext());

StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
    @Override
    public void onResponse(String response) {
        ....
    }
}, new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
        ....
    }
});

mRequestQueue.add(stringRequest);

比起AsyncHttpClient,加入了请求队列(AsyncHttpClient也有线程池),线程调度,缓存DiskLruCache,支持的缓存类型:

  • 网络缓存
  • 资源缓存
  • 文件缓存
  • 视频缓存
  • 内容URI缓存

等等吧,也是给我们网络层提供了不少的遍历,接下来看看Retrofit+RxJava

Retrofit+RxJava

public interface ApiService {
    @GET("demo")
    Observable<Demo> getDemo(@Query("start") int start, @Query("count") int count);
}
        // 使用例子
        apiService.getDemo(0, 10)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<Demo>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        Log.d(TAG, "onSubscribe: ");
                    }

                    @Override
                    public void onNext(Demo demo) {
                        Log.d(TAG, "onNext: " + demo.getTitle(
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值