市面上常见的网络框架(OKgo,Nohttp,xutils,vo
1.okgo:
该库是封装了okhttp的标准RESTful风格的网络框架,可以与RxJava完美结合,比Retrofit更简单易用。支持大文件上传下载,上传进度回调,下载进度回调,表单上传(多文件和多参数一起上传),链式调用,可以自定义返回对象,支持Https和自签名证书,支持超时自动重连,支持cookie与session的自动管理,支持四种缓存模式缓存网络数据,支持301、302重定向,扩展了统一的上传管理和下载管理功能。
1.支持的常用功能
一般的 get,post,put,delete,head,options请求
基于Post的大文本数据上传,postString(),postJson()等
多文件和多参数统一的表单上传(允许监听上传进度)
支持一个key上传一个文件,也可以一个Key上传多个文件
大文件下载和下载进度回调
大文件上传和上传进度回调
支持cookie的内存存储和持久化存储,支持传递自定义cookie
提供网络缓存功能,默认支持304缓存协议,并额外扩展了三种本地缓存模式
支持301、302重定向
支持链式调用
支持可信证书和自签名证书的https访问
支持根据Tag取消网络请求
支持自定义泛型Callback,自动根据泛型返回对象
具体详解:okgo 详解
2.Nohttp
NoHttp简介:
NoHttp是一个Android开源网络框架,实现了RFC2616(Http1.1)协议,一个标准的Http框架。支持普通请求、文件的上传与下载、自动维持Cookie、支持RFC2616规定的所有请求方法(POST、GET、HEAD……)、支持Https(包括访问自签名网站)、支持请求优先级、支持请求与Activity联动、提供了五种缓存策略供开发者选择……
请求和下载都是队列,平均分配每个线程的资源,支持多个请求并发。
支持GET、POST、PUT、PATCH、HEAD、DELETE、OPTIONS、TRACE等请求协议。
支持基于POST、PUT、PATCH、DELETE的文件上传(Html表单原理)。
文件下载、上传下载、上传和下载的状态回调、错误回调。
提供了五种数据缓存策略供开发者选择使用。
支持自定义Request,利用NoHttp泛型可以解析成任何数据格式(String、Json、JavaBean等)。
支持Session、Cookie的自动维持,App重启、关开机后还持续维持。
支持Https、自签名网站Https的访问、支持Https双向验证。
支持取消某个请求、取消指定多个请求、取消所有请求。
支持重定向、多级别重定向。支持代理、支持Request的优先级。
具体使用方式:NoHttp详解
3.xutils
xUtils一个Android公共库框架,主要包括四个部分:View,Db, Http, Bitmap 四个模块。
View模块主要的功能是通过注解绑定UI,资源,事件。
Db模块是一个数据库orm框架, 简单的语句就能进行数据的操作。
Http模块主要访问网络,支持同步,异步方式的请求,支持文件的下载。
Bitmap模块是加载图片以及图片的处理, 支持加载本地,网络图片。而且支持图片的内存和本地缓存。
详细介绍:xutils详解
4.volley
所谓Volley,它是2013年Google I/O上发布的一款网络框架,基于Android平台,能使网络通信更快,更简单,更健全。
它的优点:(1)默认Android2.3及以上基于HttpURLConnection,2.3以下使用基于HttpClient;(2)符合Http 缓存语义 的缓存机制(提供了默认的磁盘和内存等缓存);(3)请求队列的优先级排序;(4)提供多样的取消机制;(5)提供简便的图片加载工具(其实图片的加载才是我们最为看重的功能);(6)一个优秀的框架。
不足之处也有:它只适合数据量小,通信频繁的网络操作,如果是数据量大的,像音频,视频等的传输,还是不要使用Volley的为好
详细介绍:Volley使用及其原理解析
Hashmap
1.HashMap的数据结构
数据结构中有数组和链表来实现对数据的存储,但这两者基本上是两个极端。
数组:数组存储区间是连续的,占用内存严重,故空间复杂的很大。但数组的二分查找时间复杂度小,为O(1);数组的特点是:寻址容易,插入和删除困难;
链表:链表存储区间离散,占用内存比较宽松,故空间复杂度很小,但时间复杂度很大,达O(N)。链表的特点是:寻址困难,插入和删除容易。
2.存取原理
put 方法:当程序试图将一个key-value对放入HashMap中时,程序首先根据该 key的 hashCode() 返回值决定该 Entry 的存储位置:如果两个 Entry 的 key 的 hashCode() 返回值相同,那它们的存储位置相同。如果这两个 Entry 的 key 通过 equals 比较返回 true,新添加 Entry 的 value 将覆盖集合中原有 Entry的 value,但key不会覆盖。如果这两个 Entry 的 key 通过 equals 比较返回 false,新添加的 Entry 将与集合中原有 Entry 形成 Entry 链,而且新添加的 Entry 位于 Entry 链的头部
get元素时,首先计算key的hashCode,找到数组中对应位置的某一元素,然后通过key的equals方法在对应位置的链表中找到需要的元素。
假若现在同时有A线程和B线程同时获得了同一个头节点并对其进行修改,这样A写入头节点之后B也写入头节点则会将A的操作覆盖