市面上常见的网络框架(OKgo,Nohttp,xutils,volley)

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的操作覆盖

3. hashtable对比

image

你可能感兴趣的:(市面上常见的网络框架(OKgo,Nohttp,xutils,volley))