问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:2022-04-21 20:23

我来回答

1个回答

热心网友 时间:2023-05-24 08:29

一个好用的网络底层框架可以很大的程度上方便自己的项目,我们下面要做的就是一个趁手的网络框架。
做一个网络框架我们首先要确定这个网络框架除了能够从网络上获取数据还需要哪些功能:
首先抛弃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://www.xxx.com/aaaa.api的形式。
GET:对于GET方法我们可以将请求API写作http://www.xxx.com/aaaa.api K1=va1&K2=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://www.xxx.com/aaaa.api K1=va1&K2=va2。对于Post格式的请求接口,他会把传递过来的数据转换为BasicNameValuePair的形式,并放在表单中提交。

需要注意的是,因为我们把每个HttpRequest都放在了子线程中执行,所以RequestCallback的回调不能直接操作UI线程的控件,所以这个时候Handler就可以用到了。使用这个就可以保证RequestCallback的回调在UI线程上,不会报错。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
粒上皇开口熟栗120g*5袋(共600g)-详细介绍 三皇王板栗介绍 品牌榜:2024年板栗十大品牌排行榜 投票结果公布【新】 为什么来大姨妈胸会胀 少儿学什么舞蹈 青年学什么舞蹈好 成年人学什么舞蹈 福州企业最低工资标准 2013年厦门的底薪是多少 生产要素的需求有哪些性质 Android应用框架是指什么? iPhone7无法连接到App Store怎么解决 iphone7无法更新系统 苹果手机开不了机怎么办 iPhone7无法开机原因 苹果7无法连接到app store怎么办 苹果7无法开机怎么办 苹果7不能启动了如何解决? Guitar Pro 7中如何打印 guitar pro7如何在全音休止符小节添加歌词? guitar pro7乱码怎么办?谁有解决办法或者破解补丁... 关于芭蕾舞的一些名称~ 谁有软件 guitar pro 7 中文破解版 我想问一些有关芭蕾的问题 guitar pro7怎么改中文 第八单元作文有关芭蕾 guitar pro7乱码怎么办? 请教有关芭蕾舞的基本术语 吉他打谱软件 关于芭蕾舞的格言 Guitar Pro 7怎么导入音色库 什么是android的框架开发 Android系统原理及开发要点详解的前 言 熟悉Android开发平台的框架原理,能够熟练使用Andro... MVC 模式的原理,它在 Android 中是如何运用的? android 开发框架有哪些 手机android服务框架是什么意思 Android SDK的工作原理 android 有哪些框架框架 Android框架揭秘的目录 剪切编辑音乐的软件有哪些? 公积金交易密码修改 公积金个人密码怎么修改 怎么更改公积金交易密码 住房公积金怎么修改密码? 如何在手机上修改住房公积金密码? 公积金怎么重设置密码 公积金账号密码忘记了怎么办 个人住房公积金查询密码忘了怎么修改密码 公积金账户初始密码怎样修改 住房公积金的密码怎么改