android 开发非常有用的库1.2.3.4

一:


    简介

    LiteHttp是一款简单、智能、灵活的HTTP框架库,它在请求和响应层面做到了全自动构建和解析,主要用于Android快速开发。借助LiteHttp你只需要一行代码即可完美实现http连接,它全面支持GET, POST, PUT, DELETE, HEAD, TRACE, OPTIONS 和 PATCH八种基本类型。LiteHttp能将Java Model转化为http请求参数,也能将响应的json语句智能转化为Java Model,这种全自动解析策略将节省你大量的构建请求、解析响应的时间。并且,你能自己继承重新实现Dataparser这个抽象类并设置给Request,来将http原始的inputstream转化为任何你想要的东西。


引言
  2012年底开发聚划算android至今,积累了不少的教训与经验,这里陆续会向小伙伴输出一些简单的库。
  一个案例展示LiteHttp的基础功能:  http://litesuits.github.io/guide/http/get-start.html
  项目来自我的开源站点: http://litesuits.com
  看到下面有反馈中文乱码,根据经验一般都是手机端和服务器编码不一致,手机端默认UTF-8,之前有同学信誓旦旦说服务器utf-8,最后用gbk2312才解决。所以一定确保手机和服务器编码一致,办法可网上查。

特色及功能
  • 单线程,所有方法都基于一个线程,绝不会跨线程,多线程的事情交给它自带的AsyncExecutor 或者更专业的框架库来解决。
  • 灵活的架构,你可以轻松的替换Json自动化库、参数构建方式甚至默认的apache http client连接方式。
  • 轻量级,微小的的开销,core jar包仅约86kb。
  • 多种请求类型全面支持:get, post, head, put, delete, trace, options, patch.
  • 多文件上传,不需要额外的类库支持。
  • 内置的Dataparser支持文件和位图下载,你也可以自由的扩展DataParser来把原始的http inputstream转化为你想要的东西。
  • 基于json的全自动对象转化: 框架帮你完成Java Object Model 和 Http Parameter之间的转化,完成Http Response与Java Object Model的转化。
  • 自动重定向,基于一定的次数,不会造成死循环。
  • 自动gizp压缩,帮你完成request编码和response解码以使http连接更加快速.
  • 通过网络探测完成智能重试 ,对复杂的、信号不良的的移动网络做特殊的优化。
  • 禁用一种或多种网络, 比如2G,3G。
  • 简明且统一的异常处理体系:清晰、准确的抛出客户端、网络、服务器三种异常。
  • 内置的AsyncExecutor可以让你轻松实现异步和并发的http请求,如果你喜欢,随意使用你自己的AsyncTask或Thread来完成异步,推荐使用更强大、高效的专业并发库( https://github.com/litesuits/android-lite-async )。

下一步计划
  1. 给出上传、下载进度
  2. 加入缓存机制

节操与理念, LiteHttp所坚持的理念:
  1. 坚持 性能优先 不改变:将不断提升性能
  2. 坚持 专一化 策略不改变:只做网络连接,精而深
  3. 坚持 轻量级 策略不改变:加功能的基础上保持最轻量(99K以内)

架构图
一个良好的项目结构:

  • 底层是业务无关的框架库,用之四海而皆准。
  • 中层是针对业务的三方库,以及主要逻辑实现,全部业务都在这里。
  • 上层是Activity、Fragment、Views&Widget等视图渲染和业务调用。 
    这样一个结构,使得你的代码快速在phone和pad以及tv之间迁移,且让你整个更为清晰。那么LiteHttp就位于这个结构的底层。

LiteHttp结构模型:


基本用法 基础请求
  1. LiteHttpClient client = LiteHttpClient.getInstance(context);
  2. Response res = client.execute(new Request("http://baidu.com"));
  3. String html = res.getString();
复制代码


异步请求
  1. HttpAsyncExcutor asyncExcutor = new HttpAsyncExcutor();
  2. asyncExcutor.execute(client, new Request(url), new HttpResponseHandler() {
  3.         @Override
  4.         protected void onSuccess(Response res, HttpStatus status, NameValuePair[] headers) {
  5.                 // do some thing on UI thread
  6.         }

  7.         @Override
  8.         protected void onFailure(Response res, HttpException e) {
  9.                 // do some thing on UI thread 
  10.         }
  11. });
复制代码


Java Model 作为参数的请求
  1. // build a request url as :  http://a.com?name=jame&id=18
  2. Man man = new Man("jame",18);
  3. Response resonse = client.execute(new Request("http://a.com",man));
复制代码
Man:
  1. public class Man implements HttpParam{
  2.                 private String name;
  3.                 private int id;
  4.                 private int age;
  5.                 public Man(String name, int id){
  6.                 this.name = name;
  7.                 this.id= id;
  8.         }
  9. }
复制代码


全自动Json转化
  1. String url = "http://litesuits.github.io/mockdata/user?id=18";
  2. User user = client.get(url, null, User.class);
复制代码

User Class:

  1. public class User extends ApiResult {
  2.         //全部声明public是因为写sample方便,不过这样性能也好,
  3.         //即使private变量LiteHttp也能自动赋值,开发者可自行斟酌修饰符。
  4.         public UserInfo data;

  5.         public static class UserInfo {
  6.                 public String name;
  7.                 public int age;
  8.                 public ArrayList<String> girl_friends;
  9.         }
  10. }

  11. public abstract class ApiResult {
  12.         public String api;
  13.         public String v;
  14.         public Result result;

  15.         public static class Result {
  16.                 public int code;
  17.                 public String message;
  18.         }
  19. }
复制代码

User JSON:

  1. {
  2.         "api": "com.xx.get.userinfo",
  3.         "v": "1.0",
  4.         "result": {
  5.                 "code": 200,
  6.                 "message": "success"
  7.         },
  8.         "data": {
  9.                 "age": 18,
  10.                 "name": "qingtianzhu",
  11.                 "girl_friends": [
  12.                         "xiaoli",
  13.                         "fengjie",
  14.                         "lucy"
  15.                 ]
  16.         }
  17. }
复制代码


多文件上传
  1. String url = "http://192.168.2.108:8080/LiteHttpServer/ReceiveFile";
  2.         FileInputStream fis = new FileInputStream(new File("sdcard/1.jpg"));
  3.         Request req = new Request(url);
  4.         req.setMethod(HttpMethod.Post)
  5.                 .addParam("lite", new File("sdcard/lite.jpg"), "image/jpeg")
  6.                 .addParam("feiq", new File("sdcard/feiq.exe"), "application/octet-stream");
  7.         if (fis != null) req.addParam("meinv", fis, "sm.jpg", "image/jpeg");
  8.         Response res = client.execute(req);
复制代码


文件和位图下载
  1. // one way
  2. File file = client.execute(imageUrl, new FileParser("sdcard/lite.jpg"), HttpMethod.Get);
  3. // other way
  4. Response res = client.execute(new Request(imageUrl).setDataParser(new BitmapParser()));Bitmap bitmap = res.getBitmap();
复制代码

之前有小伙伴反馈的HTTP POST方式穿参现在已经彻底重写,修复。并做了详细测试:    

收藏并克隆LiteHttp Github 仓库吧,并且可以看到更多的使用案列,方便你进阶。
Github:https://github.com/litesuits/android-lite-http











二:


█ LiteCommon █ 丰富通用的android工具类库


LiteCommon项目简介

LiteCommon是一系列通用类、辅助类、工具类的集合,有以下特点:

  • 通用性强:只有常用,才可入席。
  • 体积超小:不到50K!加入增强IO包混淆后70K!
  • 纯  纯  纯:类间独立,单挑大梁,极少耦合,就是单纯!

其中包括shell命令,静默安装,bitmap处理,文件操作,加密存储器,计数器,均值器,吐司,日志,校验,提示,网络监测等基础功能,以及一些Base64、MD5、Hex、Byte、Number、Dialog、Filed、Class、Package、Telephone、Random等工具类。

1. async包:异步与并发
  • AsyncExecutor: 一个简单的可以自定义线程池并发执行器

2. log包:日志

  • Log: 一个和android系统日志类同名(方便快速替换)的Log工具类,不同的是这个Log具有一键开关功能,方便快速开发打开调试模式。


3. assit包:辅助
  • Averager: 均值器, 添加一些列数字或时间戳,获取其均值。
  • Base64: Base64, 兼容到android1.0版本的Base64编解码器。
  • Check: 检测类, 检测各种对象是否为null或empty。
  • LogReader: 日志捕获器, 将某个程序、级别的日志记录到sd卡中,方便远程调试。
  • Network: 网络探测器, 判断网络是否打开、连接、可用,以及当前网络状态。
  • SilentInstaller: 安装器, 静默安装、卸载(仅在root过的手机上)。
  • TimeAverager: 计时均值器, 统计耗时的同时,多次调用可得出其花费时间均值。
  • TimeCounter: 计时器, 顾名思义,统计耗时用的。
  • Toastor: 吐司, 解决多次连续弹出提示问题,可只弹出最后一次,也可连续弹出轻量级提示。

4. data包:数据处理
  • DataKeeper: 加密存储器,持久化工具,可加密,更简单、安全的存储(持久化)、获取数字、布尔值、甚至对象。
  • chipher包: 放置加解密辅助类。

5. io包:文件与IO
  • Charsets: 字节编码类
  • FilenameUtils: 通用的文件名字、路径操作工具类
  • FileUtils: 通用文件操作工具类
  • IOUtils: 通用IO流操作工具类
  • StringCodingUtils:字符串编码工具类
  • stream包: IO流操作辅助类

6. utils包:常用工具类
  • AndroidUtil: android信息, 获取android手机品牌、商家、版本号等信息
  • AppUtil: app工具, 检测是否前台运行,服务是否运行中等
  • BitmapUtil: 位图操作, 拍照,裁剪,圆角,byte、string互转,压缩,放缩,保存等
  • ByteUtil: byte工具类
  • ClassUtil: 类工具, 新建实例,判断类的类型等
  • DialogUtil: 对话框工具类, 统一全局对话框
  • FieldUtil: 属性工具类,获取属性值、获取属性泛型类型等
  • FileUtil: 文件工具类
  • HexUtil: 16进制工具类,16进制和byte、char像话转化
  • MD5Util: MD5工具类
  • NotificationUtil:通知工具类,便捷显示到顶部栏
  • NumberUtil: 数字工具类,各种数字安全转化
  • PackageUtil: 应用程序类,打开、安装,卸载,启动应用以及获取应用信息
  • RandomUtil: 随机工具类,产生随机string或数字,随机洗牌等
  • SerializeUtil: 序列化工具类
  • ShellUtil: shell 命令工具类
  • TelephoneUtil: 电话工具类,手机号、运营商、IMEI、IMSI等信息
  • VibrateUtil: 震动工具类,调用系统震动功能

此项目开源地址: https://github.com/litesuits/android-common



三:█ LiteAsync █ 强大的 android 异步 框架库 【专注异步与并发】



本帖最后由 移动天宇 于 2014-12-11 16:48 编辑

Hi,buudy~ 为勾引出话题,我们先看以下场景

  1. 两个原子任务,任务2需要等待任务1完成了才能进行。
  2. 任务3需要等任务1和任务2都完成了才能进行,但是1和2可以并发以节省时间。
  3. 服务器接口压力过大,要被你的调用频度调戏到down机啦!
  4. 系统的异步任务类AsyncTask要用的泛型太多太重啦,并且只能在主线程使用,子线程崩溃,整个人都SOGA了!
  5. 要么大量并发使手机cpu吃紧卡到爆,要么不能真正(Android系统自带AsyncTask)并发执行,纳尼!
  6. 异步任务有个异常,导致流程中断或者直接闪退,(⊙o⊙)哦,not cool ~


OK,如果你都遇到过,是不是需要自己写很多异步调度逻辑呢?坑爹的业务逻辑,还能不能愉快的玩耍了!
那么需要多少代码才能灰常和谐的完成这种并发和任务调度呢?
520行?69行?nooooo!有了Crossbow,我们只要一行代码

比方说场景2, Task3要等待Task1,Task2执行完才能执行,我们使用LiteAsync可以这样做:
TaskExecutor.newCyclicBarrierExecutor().put(task1).put(task2).start(task3);

这么一行代码,低调,内敛,而又充满能量,再多的任务可以执行,Task1,Task2并发执行,且随时可取消执行,结束(或取消)时会自动调度Task3执行。

让我们再搞的AsyncTask深入一点,来谈谈并发,研究过Android系统源码的同学会发现:AsyncTask在android2.3的时候线程池是一个核心数为5线程,队列可容纳10线程,最大执行128个任务,这存在一个问题,当你真的有138个并发时,即使手机没被你撑爆,那么超出这个指标应用绝对crash掉。
后来升级到4.0,为了避免并发带来的一些列问题,AsyncTask竟然成为序列执行器了,也就是你即使你同时execute N个AsyncTask,它也是挨个排队执行的。

这一点请一定注意,AsyncTask在4.0以后,是异步的没错,但不是并发的。真的不能愉快的玩耍了,女朋友还在家里等你交作业,怎么办?

言归正传,我们来看看LiteAsync能做些什么吧:

Crossbow构件一览:
      
  1. Ameliorative AsyncTask:真正可并发,均衡手机能力与开销,针对短时间大量并发有调控策略,可在子线程执行。
  2. SimpleTask:具备Ameliorative AsyncTask所有特性,简化了使用方法,仅设置一个泛型(结果类)即可。
  3. SafeTask:具备Ameliorative AsyncTask所有特性,但是各个环节是安全的,能捕获任何异常,并传递给开发者。
  4. CachedTask:具备Ameliorative AsyncTask所有特性,增加了对结果的缓存,可设置一个超时时间,只有在超时后才去异步执行,否则取缓存结果返回。


TaskExecutor任务调度器一览:
        
  1. 顺序执行器,使一系列异步任务按序执行,非并发
  2. 关卡执行器,使一系列异步任务并发执行,最后会调度执行一个终点任务
  3. 延迟执行器,使一个异步任务延迟开发者指定的时间后执行

  4. 心跳执行器,是一个异步任务按执行的间隔持续执行


介绍完了,和她共事你会发现她很技巧很多,让你欲罢不能,结合LiteOrm和LiteHttp,那画面太美(Jian)不敢看。

我在github工程里各自都谢了demo和案例,足够起步进阶。

Demo图:      
此项目传送门:https://github.com/litesuits/android-lite-async



四:█ LiteOrm █ 极简且智能的 android ORM 框架库 【专注数据库】


Archiver(LiteOrm)
——极简且智能的android ORM 框架库

前言  — 摘自litesuits
小而美,值得努力,单纯至极才够简洁,简洁至极方如你所想。
3年乃至N年后Lite系列仍会坚持 专注、简洁、快而稳、小而美的理念。
且我认为每个细分的技术领域都应该至少有一款乃至几款小而美的库: 百花齐放、百家争鸣
而框架之间、不同功能模块之间应该 依赖抽象而非实现,可快速的替换实现(库),而不是强耦合或大而全(awful),产品亦是如此,如果你不是平台,不是微信(即便微信也不敢贪多),其实不应该一锅烩,这一点恰恰是目前国产框架容易题发生的问题(但仍需要感激它们以及作者辛苦为开发者提供的便利)。
做框架如做产品,服务她,做好她,需要一些专注。

言归正传,说明下特色和功能。
Archiver 特色:
  • 轻量,专注,性能优先,线程无关,专注数据及其关系(关系是重点)存储和读取。
  • 不需要工具辅助,实体不需要无参构造,不需要繁多注解,约定大约配置,一切多余的,都不需要
  • 使用极致简约:db.save(u);    db.delete(u);    db.deleteAll(U.class);

Archiver 功能:
  • 丰富的基础性增删改查接口支持:save(insert or replace), insert, update, delete, query, mapping...以及各种边缘功能并支持冲突算法
  • 支持多库,每个数据库文件对应一个DataBase实例,它们共享实体信息,表信息独立。一般单数据库情况下,建议自己维护单例DataBase db = LiteOrm.newInstance(context, "dbname"),  减少开销。
  • 查找时自动构建对象,不需要无参构造函数
  • 支持仅更新指定列,支持向指定列灵活(批量)赋值,将无视对象中该属性的真实值。
  • 自动建表:开发者无需关心数据库以及表细节。
  • 智能识别数据类型:分别转化为以sqlite支持的TEXT, REAL, INTEGER, BLOB几种数据类型存储。
  • 智能列探测:如User这个类多加了一个sex标识性别,Archiver将自动添加该列入已经建好的表,以支持新属性。
  • 实体关系持久化和关系映射:真正实现实体关系映射持久化以及恢复,而开发者只需要在实体的关联属性上标出关系类型即可。
  • 序列化字段皆可存储:各种ArrayList、Vector等各种容器智能保存及读取。
  • 丰富的约束性语法支持:NOT NULL, UNIQUE, DEFAULT, COLLATE, CHECK, PRIMARY KEY
  • 自由灵活的查询:columns, where, roder, limit, having group, etc.

正在实现的功能:
1. 信息加密功能,防止破库后数据裸奔。
2. 数据校验功能,防止破库后数据篡改。


目标:有用的android ORM 框架库
---

关于功能取舍
需求左右功能,然而需求千变万化,所以做产品做框架就有取舍。
当一个人为了挂壁画而去买电钻时,难道他买的不是墙上的洞吗?这确是没错的。
如果我能提供打洞兼挂壁画的服务,不是更方便更让用户满意吗?这确是没错的。
然而用户买点钻,仅仅为了挂壁画吗?他还可能用来做更多的事!这也是没错的。
所以我做框架时,电钻是一定提供的,但也会提供一些更直接、更专项的接口来更便捷的让开发者完成任务。
这是我做框架时取舍功能的基本原则。

关于设计理念
简约的背后,往往是复杂。
为了省掉开发者存取数据时大量的繁杂重复劳动,我设计并实现了这款自动化ORM框架。
开发者只要引入我的Archiver Library,即可轻松愉快的使用全部功能。
Archiver不强制要求开发者为每个对象添加一个无参构造,这很傻很多余。
Archiver不需使用任何工具辅助,更不需DAOGenerator,仅仅需要极少量注解。
Archiver主线思路是约定大于配置,所以你可以用极少的注解完成复杂数据的存储。
Archiver各个方法都承担着自己的使命从不泛滥,简单易用,你用一下,就明白了。
Archiver关注性能,代码每个模块我都有仔细琢磨,各个功能的实现绕过了android提供的直接接口而比较贴近底层的实现。
Archiver超级轻量、专注,你甚至看不到任何包括线程在内的其他功能存在,你根本不用担心增加你项目的负担,引入一个大包袱。

而这一切,就是为了还原面向对象本应有的体验,让增加的部分,并未增加。

Samples 案例:

 

此项目地址:   https://github.com/litesuits/android-lite-orm   








  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值