android网络框架(Android框架)

http://www.itjxue.com  2023-02-13 14:17  来源:未知  点击次数: 

android底层网络框架是怎么实现的

一个好用的网络底层框架可以很大的程度上方便自己的项目,我们下面要做的就是一个趁手的网络框架。

做一个网络框架我们首先要确定这个网络框架除了能够从网络上获取数据还需要哪些功能:

首先抛弃AsyncTask,自定义一套网络底层的封装框架。

设计一套适合自己App的缓存策略

设计一套假数据返回的机制,在网络请求API没有返回的时候,可以假装获取到了网络返回的数据。

封装用户cookie的逻辑。

其他的还好,可能有人对于第一步的那个抛弃AsyncTask有些疑问,就是为什么要抛弃啊,这个类这个好用,内部封装了那么多的方法。但是我们不能只看到这个的优点,这个类有个致命的缺点:不能灵活的控制内部的线程池。

我们都知道的是,线程池里面的每个线程都是API的调用请求,而AsyncTask中有没有暴漏出取消这些请求的方法,这个时候,如果我们从A界面调到B界面,那么在A界面调用的API请求,如果还没有返回,并不会被取消,对于一个频繁调用API请求的APP应用应用来说,一个界面调用的API可能超过十个,在网络不好的情况下,如果这个时候跳转到了其他界面,这个时候其他界面也会调用API,这个时候造成的情况就是这个界面的请求并不会显示数据,因为首页的请求还在排队,要等首页的请求完成之后你才可以调用,这个就是所谓的AsyncTask堵塞。

我刚工作的时候遇到一个情况就是,根据公司的情况写了一个统计用户交互数据的SDK,开始的使用时候就是这个AsyncTask类,结构我发现在APP中某一个界面的吊起特别的慢,数据加载也非常的慢,发现的原因是我写的这个SDK中的API请求调用超时,并且在超时的时候重复调用三次这个API。

网络请求的格式

网络请求两个方法POST和GET,我们一般把GET方法为请求数据,POST为修改数据。请求的方法格式也是相对有讲究的。

Request

所有的MobileApi都可以写作:http://的形式。

GET:对于GET方法我们可以将请求API写作http:// K1=va1K2=va2,形式,也就是说,把key-value这样的键值对存放在URL上,这样做的话会方便我们后面对数据进行缓存,另外要精良是GET的参数都是String,int这样的类型,方便缓存,解析。

POST:我们都知道看不见POST的请求数据,一般key-value这样的键值对存放在Form表单中,最后进行提交请求。POST经常会提交大量数据,所以有些键值对要定义成集合或复杂的自定义实例,这个时候我们就需要把这样的值转换为JSON字符串进行提交,有APP传递到API后,在将JSON字符串转换为对于的实体。

Response

服务器现在用的最多的是使用JSON作为api返回的结果,这里也是使用JSON。

一般情况下返回的json数据中要有以下数据:

首先一个是否调用api成功的参数,

另外一个错误类型的参数(这个参数可以是Int格式的参数,成功为0)

错误具体信息的参数,成功为“”

具体API返回的结果,失败为“”

所以我们定义一个Response实体类,作为JSON实体的最外层。

如果成功返回了数据,数据会存放在result字符按中,映射为Response实体的result属性。

如果上面返回的result是一种实体的集合,那么就要把result解析为相应的实体集合。

我们在前面看到我们把AsyncTask抛弃重新写一个扩展性强的,可以随时取消API请求网络底层,那么我们的这个网络底层的线程池使用的是什么:使用原生的ThreadPoolExecutor + Runnable + Handler

首先我们要把App所调用的所有的API接口放到一个类或者xml文件中去,我们这里放在xml文件里面去,当然要写出读取xml的类和函数:

其中key和url的值符合key-value键值,expires代表数据缓存的时间单位为毫秒,netType代表请求方式(POST和GET) ,mockClass代表的是返回假数据的类。

RemoteService和RequestCallback和RequestParameter

这三个类表示的是请求的服务,请求返回,请求参数,三个给APP调用的类。

其他的两个类在方法中调用:

context:表示上下文

key:即xml文件中的key

RequestParameter:请求携带的参数

callback:请求回调

forceUpdate:是否强制更新数据,忽略缓存

RequestMannager类是一个集合类,用于取消请求的。每次发起请求时,都会把为此创建的Request添加到RequestManager中,即RequestManager中保存了全部的request。

他是对ThreadPoolExecutor和ArrayBlockingQueue的简单封装,是一个线程池,每发起一次请求,这个线程池就会分配一个新的线程来执行该请求。

HttpRequest类,发起HTTP请求的地方,他事先了Runable,从而让DefaultThreadPool可以分配新的线程,所以所有的请求逻辑都在Runnable接口方法里:

在这个类中对于get请求接口,他会把传递来的数据,处理为相应的格式:http:// K1=va1K2=va2。对于Post格式的请求接口,他会把传递过来的数据转换为BasicNameValuePair的形式,并放在表单中提交。

需要注意的是,因为我们把每个HttpRequest都放在了子线程中执行,所以RequestCallback的回调不能直接操作UI线程的控件,所以这个时候Handler就可以用到了。使用这个就可以保证RequestCallback的回调在UI线程上,不会报错。

配置okhttp实现日志打印的框架是

配置okhttp实现日志打印的框架是android网络http框架。根据查询相关资料得知,okhttp的android网络http框架,封装了请求参数处理,日志打印。优点是可以传入多参数打印,懒人必备。

Android网络篇(四)—— 自己动手封装一个属于自己的网络请求框架

网络请求框架算是android体系当中一个比较重要的部分,在android历史中关于网络的演进也经历了几个阶段,到目前为止,比较通用的网络请求框架就是OkHttp + Retrofit +RxJava+Gson,当然,关于这个组合使用网上也有很多,但是,那个毕竟是别人的东西,大部分时候只有适合自己的才是最好的,所以,自己封装一个网络请求框架就显得比较重要了,废话不多说,直接动手开干。

网络请求框架封装大概流程如下:

当然,在基本流程之外还有一些辅助类:

然后在我们的Application里面进行初始化设置

当然,别忘记在清单文件里面设置网络权限哦

最后需要注意的是,千万别导入错误的包,我引入的依赖为

最后看下效果

在这里我只测试了Get请求(使用Path形式)和Post请求(带参以RequestBody方式提交),其他的大家可以根据自己的需求自行测试。

Android 网络框架解压缩(gzip)浅谈

六谈这个话题,是因为很多时间都忽略了这个因素,网络传输数据的压缩很少有人去关注,然而有时间提到这个问题的时间却一时不知道怎么回答,或者已经忘掉了这个概念...

进入正题,首先来聊聊Gzip。

Gzip是GNUZip的缩写,他是一个GNU自由软件的文件圧缩程序。

我们在进行网络传输数据时,经常用到json、xml等格式的数据,这些数据在传输前可以进行压缩,这时候就会涉及到一种压缩格式—Gzip。Gzip的压缩比率非常大,有的甚至能达到99.9%以上,可以大大减少传输内容,提高用户的传输速度,进而提高用户的体验。

比如我们通过第一个链接看一下“开源中国的新闻页”,网址如下:

;pageIndex=0pageSize=20

结果显示,这个网页没有进行压缩,源文件大小为12KB,而压缩后,文件可减小到0.01KB,可以节省99.92%的传输控件。这是什么概念呢?相当于100MB的数据经过压缩后不到1MB。

说道这里,我们先说一下Http中的Gzip技术细节

HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术。一般服务器中都安装有这个功能模块的,服务器端不需做改动,当浏览器支持gzip 格式的时候, 服务器端会传输gzip格式的数据。具体讲就是 http request 头中 有 "Accept-Encoding", "gzip" ,response 中就有返回头Content-Encoding=gzip ,我们现在从浏览器上访问玩啥网站都是gzip格式传输的。

同样的的道理,我们可以在android 客户端 request 头中加入 "Accept-Encoding", "gzip" ,来让服务器传送gzip 数据。

首先,客户端发请求给服务端,会带上请求头:Accept-Encoding:gzip。第二步,服务端接收到请求头后,可以选择压缩或不压缩。第三步,服务端选择压缩后,文件明显变小,同时在响应头加上Content-Encoding:gzip。第四步,客户端接收到响应后,根据响应头中是否带有Content-Encoding:gzip,判断文件是否被压缩,如果压缩就进行解压,如果没有压缩,就按照正常方式读取数据即可。

OKhttp3.4.0开始将这些逻辑抽离到了内置的interceptor中,看起来较为方便

在 BridgeInterceptor.java 这个类里边可以看到

如果header中没有Accept-Encoding,默认自动添加 ,且标记变量transparentGzip为true。

针对返回结果,如果同时满足以下三个条件:

移除 Content-Encoding、Content-Length,并对结果进行解压缩。

可以看到以上逻辑完成了,由此我们通过OkHttp源码得出以下结论:

由于引用太多源码就不写了,直接针对以上6点做结果分析

? ? ? ?? Android’s HTTP Clients

? ? ? ?? HttpURLConnection

? ? ? ?? HTTP 协议中的 Transfer-Encoding

Android监听网络状态框架

就这么简单,让我们开始吧。

看下最终实现的使用:

日志:

好了,新建一个AndroidLibray开始实现。

权限走一波:

首先,咱们需要一个监听网络状态的工具类

在lib中创建一个广播,然后再配置文件里注册一下。

完善下咱们的receiver:

监听接口:

manager:

再加上一个枚举类:

OK,一套正常操作,一个最普通网络监听类写完了。接着咱们尝试用注解,让这个小框架看的有档次些。

完善一下自定义注解:

然后来捋一下思路:

照样是固定三部曲,按照步骤来:

1.先完善我们的注册方法

在这里,我创建了一个方法封装类。比较简单: MethodManager

这里的 mMethodList 是方法封装类(MethodManager)的List,用来存储筛选后的MainActivity中方法,也就是网络监听方法。以下是方法的筛选:

咱们定义一个post方法,去完成这项工作:

这里实现了通过网络监听注解上方的参数,我们可以单独监听某一种网络状态的变化。比如

上方参数表明,只有在WIFI断开和连接的时候,方法才会做出响应。想要所有提示设置为AUTO就行啦。

OK,做完逻辑以后执行一下:

大功告成!跑一下看看效果!

项目地址:

是一个练手的小项目,实际网络请求在7.0时就能通过一个CallBack轻松搞定了。

(责任编辑:IT教学网)

更多

推荐网络创业文章