Java实现基于LRU的磁盘缓存。
图片加载。
Glide 支持拉取,解码和展示视频快照,图片,和GIF动画。
适合用在那些对图片依赖不大的App中。
Glide原理的核心是为bitmap维护一个对象池。
对象池的主要目的是通过减少大对象内存的分配以重用来提高性能。
图片的加载任务会与activity或者Fragment的生命周期绑定,当界面执行onStop时自动暂定,而当执行onStart时又会自动重新开启,同样的,动态Gif图的加载也是如此,以用来节省电量,同时Glide会对网络状态做监听,当网络状态发生改变时,会重启失败的任务,以减少任务因网络连接问题而失败的概率。
Glide 在加载资源的时候,如果是在 Activity、Fragment 这一类有生命周期的组件上进行。 当 Activity、Fragment 等组件进入不可见,或者已经销毁的时候,Glide 会停止加载资源。 Application 的生命周期贯穿整个应用,所以 applicationManager 只有在应用程序关闭的时候终止加载。
所以尽量不要在非 UI 线程使用 Glide 加载图片,尽量使用 Activity、Fragment 等带有生命周期的组件配合 Glide 使用。
为加快加载速度,提高体验,优先加载预览图。
图片加载。
已停止维护。
图片加载。
图片加载。
采用匿名共享内存来保存图片,也就是Native堆,有效的的避免了OOM,功能强大,但是库体积过大。
适合用在对图片依赖比较大的App中。
DraweeView负责和用户进行交互;
DraweeHierarchy是视图层级,管理图层;
DraweeController是控制器,管理数据。
i>DraweeView
继承于ImageView,只是简单的读取xml文件的一些属性值和做一些初始化的工作,图层管理交由Hierarchy负责,图层数据获取交由负责。
ii>DraweeHierarchy
由多层Drawable组成,每层Drawable提供某种功能(例如:缩放、圆角)。
iii>DraweeController
控制数据的获取与图片加载,向pipeline发出请求,并接收相应事件,并根据不同事件控制Hierarchy,从DraweeView接收用户的事件,然后执行取消网络请求、回收资源等操作。
iv>DraweeHolder
统筹管理Hierarchy与DraweeHolder。
v>ImagePipeline
Fresco的核心模块,用来以各种方式(内存、磁盘、网络等)获取图像。
vi>Producer/Consumer
Producer也有很多种,它用来完成网络数据获取,缓存数据获取、图片解码等多种工作,它产生的结果由Consumer进行消费。
vii>IO/Data
这一层便是数据层了,负责实现内存缓存、磁盘缓存、网络缓存和其他IO相关的功能。
Supplier:提供一种特定类型的对象,Fresco里有很多以Supplier结尾的类都实现了这个接口。
SimpleDraweeView:这个我们就很熟悉了,它接收一个URL,然后调用Controller去加载图片。该类继承于GenericDraweeView,GenericDraweeView又继承于DraweeView,DraweeView是Fresco的顶层View类。
PipelineDraweeController:负责图片数据的获取与加载,它继承于AbstractDraweeController,由PipelineDraweeControllerBuilder构建而来。AbstractDraweeController实现了DraweeController接口,DraweeController 是Fresco的数据大管家,所以的图片数据的处理都是由它来完成的。
GenericDraweeHierarchy:负责SimpleDraweeView上的图层管理,由多层Drawable组成,每层Drawable提供某种功能(例如:缩放、圆角),该类由GenericDraweeHierarchyBuilder进行构建,该构建器 将placeholderImage、retryImage、failureImage、progressBarImage、background、overlays与pressedStateOverlay等 xml文件或者Java代码里设置的属性信息都传入GenericDraweeHierarchy中,由GenericDraweeHierarchy进行处理。
DraweeHolder:该类是一个Holder类,和SimpleDraweeView关联在一起,DraweeView是通过DraweeHolder来统一管理的。而DraweeHolder又是用来统一管理相关的Hierarchy与Controller
DataSource:类似于Java里的Futures,代表数据的来源,和Futures不同,它可以有多个result。
DataSubscriber:接收DataSource返回的结果。
ImagePipeline:用来调取获取图片的接口。
Producer:加载与处理图片,它有多种实现,例如:NetworkFetcherProducer,LocalAssetFetcherProducer,LocalFileFetchProducer。从这些类的名字我们就可以知道它们是干什么的。 Producer由ProducerFactory这个工厂类构建的,而且所有的Producer都是像Java的IO流那样,可以一层嵌套一层,最终只得到一个结果,这是一个很精巧的设计?
Consumer:用来接收Producer产生的结果,它与Producer组成了生产者与消费者模式。
为Picasso提供多种图片变换,让图片呈现不同的形状。
综合Glide,让图片呈现不同的形状。
图片处理。基于OpenGL的Android过滤器,将GPUImage iOS移至Android。
Android异步HTTP库
异步Socket,HTTP(客户端+服务器),WebSocket,和socket.io库。基于NIO而不是线程。
一个Http与Http/2的客户端
支持HTTPS。缓存、异步请求、同步请求。协议类型是Http/1.0, Http/1.1, SPDY, Http/2.0, WebSocket,网络传输使用的是封装的Socket,数据读写使用的NIO(Okio)。
SPDY协议类似于HTTP,但旨在缩短网页的加载时间和提高安全性。
SPDY协议通过压缩、多路复用和优先级来缩短加载时间。
i>网络配置层
利用Builder模式配置各种参数,例如:超时时间、拦截器等,这些参数都会由Okhttp分发给各个需要的子系统。
ii>重定向层
负责重定向。
iii>Header拼接层
负责把用户构造的请求转换为发送给服务器的请求,把服务器返回的响应转换为对用户友好的响应。
iv>HTTP缓存层
负责读取缓存以及更新缓存。
v>连接层
连接层是一个比较复杂的层级,它实现了网络协议、内部的拦截器、安全性认证,连接与连接池等功能,但这一层还没有发起真正的连接,它只是做了连接器一些参数的处理。
vi>数据响应层
负责从服务器读取响应的数据。
OkHttpClient:通信的客户端,用来统一管理发起请求与解析响应。
Call:Call是一个接口,它是HTTP请求的抽象描述,具体实现类是RealCall,它由CallFactory创建。
Request:请求,封装请求的具体信息,例如:url、header等。
RequestBody:请求体,用来提交流、表单等请求信息。
Response:HTTP请求的响应,获取响应信息,例如:响应header等。
ResponseBody:HTTP请求的响应体,被读取一次以后就会关闭,所以我们重复调用responseBody.string()获取请求结果是会报错的。
Interceptor:Interceptor是请求拦截器,负责拦截并处理请求,它将网络请求、缓存、透明压缩等功能都统一起来,每个功能都是一个Interceptor,所有的Interceptor最 终连接成一个Interceptor.Chain。典型的责任链模式实现。
StreamAllocation:用来控制Connections与Streas的资源分配与释放。
RouteSelector:选择路线与自动重连。
RouteDatabase:记录连接失败的Route黑名单。
类型安全的Http客户端。
RetrofitUtils:retrofit网络工具类。
Retrofit使用注解+java接口来定义后台服务API接口
Retrofit充当了一个适配器(Adapter)的角色:用注解来描述一个HTTP请求,将一个HTTP请求抽象成一个Java接口,然后用了Java动态代理的方式,动态的将这个接口的注解“翻译”成一个HTTP请求,最后再执行这个HTTP请求。
Retrofit的功能非常多的依赖Java反射,代码中其实还有很多细节,比如异常的捕获、抛出和处理,大量的Factory设计模式。
已被墙。
Google推出的Android异步网络请求框架和图片加载框架。
支持HTTPS。缓存、异步请求,不支持同步请求。协议类型是Http/1.0, Http/1.1,网络传输使用的是 HttpUrlConnection/HttpClient,数据读写使用的IO。
获取JPush推送ID:
String regId = JPushInterface.getRegistrationID(context);
一个Java序列化/反序列化库,可以将JSON和java对象互相转换
Jackson可以轻松地将Java对象转换成json对象和xml文档,同样也可以将json、xml转换成Java对象
Java上一个快速的JSON解析器/生成器
一种用来解析单个独立html或嵌套html的方式
一个以最好的DOM,CSS和jQuery解析html的库
JDBC和Android的轻量级ORM java包
用超级简单的方法处理Android数据库
一种轻快地将对象映射到SQLite数据库的ORM解决方案。
注解Entity后,只需要build工程,DaoMaster、DaoSession和对应的Dao文件就会自动生成。
i>依赖:
// In your root build.gradle file:
buildscript {
repositories {
jcenter()
mavenCentral() // add repository
}
dependencies {
classpath 'com.android.tools.build:gradle:3.1.1'
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin
}
}
// In your app projects build.gradle file:
apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao' // apply plugin
dependencies {
implementation 'org.greenrobot:greendao:3.2.2' // add library
}
ii>建表:实体类
为需要建表的实体类添加@Entity即可。
@Entity
public class User {
@Id(autoincrement = true)//设为主键(必须有主键) true表示自增
private Long id;
private String name;
private int age;
private String sex;
@ToMany(referencedJoinProperty = "id")//限定了关系到一组其他实体的(多个实体对象),referencedJoinProperty 指定指向该实体的ID目标实体的“外键”属性的名称。此项的get和set方法务必要greenDao自动生成。
List sons ;
private String sonId;
@ToOne(joinProperty = "sonId") //一对一 sonId就是上面一行的sonId,保存的是Son类的主键。开发中遇到问题:读取User 有时候只能读到sonId,不能读到Son。解决是对son进行的另外的存取。
private Son son;
@Convert(columnType = String.class, converter = StringConverter.class)//这个类需要自己定义,见下面
private List nickNames;
}
}
//儿子类
@Entity
public class Son {
@Id
private Long id;
private String name;
private long fatherID ;
}
注意:greenDao的实体类的get和set方法不要添加,由greenDao自动生成即可,请不要手动添加。
生成完后,可以手动增加get和set方法修改数据。
@Transient:表明这个字段不会被写入数据库,只是作为一个普通的java类字段,用来临时存储数据的,不会被持久化
public class StringConverter implements PropertyConverter<List<String>, String>{
@Override
public List convertToEntityProperty(String databaseValue) {
if (databaseValue == null) {
return null;
}
else {
List list = Arrays.asList(databaseValue.split(","));
return list;
}
}
@Override
public String convertToDatabaseValue(List entityProperty) {
if(entityProperty==null){
return null;
}
else{
StringBuilder sb= new StringBuilder();
for(String link:entityProperty){
sb.append(link);
sb.append(",");
}
return sb.toString();
}
}
}
iii>MyApplication初始化
/*
通过 DaoMaster 的内部类 DevOpenHelper,你可以得到一个便利的 SQLiteOpenHelper 对象。
注意:默认的 DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表,意味着这将导致数据的丢失。
所以,在正式的项目中,你还应该做一层封装,来实现数据库的安全升级。
*/
// 可能你已经注意到了,你并不需要去编写「CREATE TABLE」这样的 SQL 语句,因为 greenDAO 已经帮你做了。
//
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "notes-db");
Database db = helper.getWritableDb();
DaoSession daoSession = new DaoMaster(db).newSession();
iv>使用
AppApplication.getInstances().getDaoSession().insert(user);//插入
UserDao userDao = AppApplication.getInstances().getDaoSession().getUserDao();
QueryBuilder builder = userDao.queryBuilder();
List zhangsan = builder.where(UserDao.Properties.Age.like("1")).list();//读取
User zhangsan = builder.where(UserDao.Properties.Age.like("1")).unique();//读取
--eq("1")
--notEq()
--like()
userDao.delete(user);//删除
userDao.deleteAll();
AppApplication.getInstances().getDaoSession().insertOrReplace(user);//修改
userDao.count()//获取表中数量
v>分页查询
SafequalityEntityDao safequalityEntityDao = MyApplication.getIntance().getDaoSession().getSafequalityEntityDao();
QueryBuilder builder = safequalityEntityDao.queryBuilder();
if (-1 != page){
builder.offset(page*9).limit(9);//分页,每页显示9个,查询第page页
}
return builder.where(SafequalityEntityDao.Properties.Type_check.like(type_check)).list();
vi>条件查询
“whereOr” where语句里面写的条件都是用“且”连接,whereOr里的语句使用“或”连接
“distinct” 直接过滤掉重负字段
“limit” 分页n个一页,一般和offset结合使用
“offset” 忽略查询出的前n条结果
“orderAsc” 以字段升序排序
“orderDesc”以字段降序
“preferLocalizedStringOrder” 本地化字符串排序
“orderCustom” 自定义排序 里面需要传两个参数: 一个属性 和对应的排序方案 ASC 或是 DESC
“orderRaw” 也是自定义排序, 把字段和 排序方案 写在一个字符串传入
“stringOrderCollation” 也是自定义排序 可以合并多个升降排序方案 以日期升序 且 价格降序
“notEq” 和eq相反,别傻傻在再去外面敲“!”取反
“notIn” 同上
“or” 或者
“like” 就是sql语句的LIKE "%"+string+"%"
“between” 也就是BETWEEN ? AND ? 可以取两个值的区间 (但是这条语句要慎用,不同的数据库不一样,有的是A<条件
“ge”相当于 >=
“lt” 相当于 <
“le”相当于 <=
“isNull” 为空
“notIsNull” 不为空
GreenDao向SQLite数据库提供了一个对象导向的接口,它为用户省下了很多重复的工作,而且提供了简便的操作接口。
根据GreenDao的规则在其中描述数据库的表结构,运行之后它会构建你的实体模型和DAO工具类。
通过generator生成的这些工具类,你就可以在自己的Android工程中对进行数据库操作,完全不需要写任何SQL语句。
具体包括:
持有数据库对象(SQLiteDatabase) ,并管理一些DAO类(不是对象)。
能够创建和删除数据库表
它的内部类OpenHelper和DevOpenHelper是SQLiteOpenHelper的实现类,用于创建SQLite数据库的模式。
管理制定模式下所有可用的DAO对象。
能对实体进行插入、加载、更新、刷新、删除操作。
每个实体都有一个DAO,相对于DaoSession,它有更多的方法,比如:加载全部、InsertTx
可持久化的对象,由generator 生成。相当于数据库中的一张表,所有字段都是使用标准的Java对象的属性。
以活动记录方式为Android SQLite提供持久化
SQLiteOpenHelper 和ContentResolver的轻量级包装
移动数据库:一个SQLite和ORM的替换品
将Android视图和回调方法绑定到字段和方法上。
ButterKnife是一个专注于Android系统的View注入框架,可以减少大量的findViewById以及setOnClickListener代码。
具体用法查看GitHub。
Java Annotation Processing是javac中用于编译时扫描和解析Java注解的
Annotation Processing是在编译阶段执行的,它的原理就是读入Java源代码,解析注解,然后生成新的Java代码。新生成的Java代码最后被编译成Java字节码,注解解析器(Annotation Processor)不能改变读入的Java 类,比如不能加入或删除Java方法
在Java代码编译成Java字节码的时候就已经处理了@Bind、@OnClick(ButterKnife还支持很多其他的注解)这些注解了。
一个Android和java快速依赖注射器。
快速安卓开发。易于维护
Android平台的Google Guice。Android上第一个依赖注入框架,已不再受支持。
创建图表的Android库
兼容到API8的Android图表库
一个强大的Android图表视图/图形库。
对于LineChart:
XAxis xl = lineChart.getXAxis();
xl.setSpaceBetweenLabels(1)
对于BarChart:
XAxis xAxis = barChart.getXAxis();
xAxis.setSpaceMax(1);
barChart.notifyDataSetChanged();
barChart.invalidate();
一个轻快的,事务性的,基于文件的FIFO的库
一个专门为Android轻松调度任务的工作队列
安卓优化的事件总线,简化了活动、片段、线程、服务等的通信。
EventBus就是publish/subscribe消息总线,主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息。
可以传递String、class
Event:
事件。可以是任何的对象。
Subscriber:
事件订阅者,接收特定的事件。方法以onEvent**开头,一共有四个方法onEvent,onEventMainThread,onEventBackgroundThread,onEventAsync。它们之间的区别在于在不同的线程。等会会有一一举例。
Publisher:
事件发布者,用于通知Subscriber有事件发生,可以在任何的地方发布事件。使用也是简单,只要调用post(Object)方法就可以了。
onEvent:
事件在哪个线程发布出来的,就会在这个线程中运行,也就是说发布事件和接收事件线程在同一个线程。
onEventMainThread:
事件无论是从哪个线程发布出来的,都会在UI线程中执行。
onEvnetBackground:
事件是在UI线程中发布出来的,那么就会在子线程中运行,如果事件本来就是子线程中发布出来的,那么就直接在该子线程中执行。
onEventAsync:
使无论事件在哪个线程发布,都会创建新的子线程
i>传递字符串
EventBus.getDefault().register(this);//接收者
EventBus.getDefault().unregister(this);//接收者
@Subscribe//接收者
public void method(String state){
switch (state){
case LoginActivity .Tag:
finish();
break;
}
}
EventBus.getDefault().post(LoginActivity.Tag);//发送者
ii>传递类
public class MessageEvent {
...
}//传递类
EventBus.getDefault().post(messageEvent);//发送
@Subscribe(threadMode = ThreadMode.MAIN)
public void XXX(MessageEvent messageEvent) {//接收方(记得写注册和取消注册)
...
}
一个基于Guava的增强的事件总线
JVM上的响应式扩展。
是一个异步的、基于事件的程序的库。
逻辑简洁。
异步实现:观察者模式。
在不指定线程的情况下, RxJava 遵循的是线程不变的原则,即:在哪个线程调用 subscribe(),就在哪个线程生产事件;在哪个线程生产事件,就在哪个线程消费事件。如果需要切换线程,就需要用到 Scheduler (调度器)。
将事件序列中的对象或整个序列进行加工处理,转换成不同的事件或事件序列。
实质上都是针对事件序列的处理和再发送。
与 Retrofit、RxBinding 的结合使用;
其他异步操作。
RxBinding 是 Jake Wharton 的一个开源库,它提供了一套在 Android 平台上的基于 RxJava 的 Binding API。所谓 Binding,就是类似设置 OnClickListener 、设置 TextWatcher 这样的注册绑定对象的 API。
为RxJava提供Joins操作
Android上的响应式扩展,在RxJava基础上添加了Android线程调度
提供用RxJava绑定Android UI的API
Android上的响应式编程
简单,漂亮,强大的Android日志工具。
输出明了,可从日志跳转到源码,不需要设置静态tag。
Logger.d("debug");
Logger.e("error");
Logger.w("warning");
Logger.v("verbose");
Logger.i("information");
Logger.wtf("wtf!!!!");
支持json、xml、Map、Collection、Array、set格式化输出。
支持Logcat和文件两种日志记录输出方式。
在调试版本上注解的触发方法进行日志记录
一个小的,可扩展的日志工具
腾讯推出的一款免费崩溃日志收集统计sdk,可直接通过gradle依赖。
使用很简单,是目前国内免费软件中功能最强大的一款。
Java编写的Mocking单元测试框架
Android UI 测试
Android单元测试框架
调试Android应用的桥梁,使得可以利用Chrome开发者工具进行调试
内存泄漏检测工具
Android应用程序崩溃报告
一款Android弹出框、对话框、Dialog、popuwindow。
圆形等待弹框。
Android6.0以后需要加入权限的时候询问用户。
文件下载框架。
注意: 使用下载文件之前,先:FileDownloader.setup(Context)
通过集成Google–zxing库实现扫一扫功能。
第三方资源。基于zxing的扫一扫,集成简单,速度快,可配置颜色,还有闪光灯,解析二维码图片,生成二维码等功能。
图片轮播。
各种样式的圆形进度条。
手写签名控件。
开发者可以使用 PullToRefresh 对各种控件实现下拉刷新或者上拉加载以及可以自定义刷新和加载部分的视图。
目前支持:ScrollView,ListView,WebView,RecyclerView。
对于单个控件,需要使用pullToRefreshLayout的功能,外层可包裹ScrollView。
取消上拉加载界面:pullToRefreshLayout.setCanLoadMore(false);
空列表显示:app:view_empty="@layout/layout_empty"
,但是并不好用。列表为
安卓选择器类库,包括日期选择器、时间选择器、单项选择器、双项选择器、城市地址选择器、车牌号选择器、数字选择器、星座选择器、生肖选择器、颜色选择器、文件选择器、目录选择器等,可自定义顶部及底部界面,可自定义窗口动画。