【Android学习】Android常用框架

1,缓存

1)DiskLruCache

Java实现基于LRU的磁盘缓存。

2,图片

1)Glide(已使用)

①概念

图片加载。
Glide 支持拉取,解码和展示视频快照,图片,和GIF动画。

②场景

适合用在那些对图片依赖不大的App中。

③原理——对象池

Glide原理的核心是为bitmap维护一个对象池。
对象池的主要目的是通过减少大对象内存的分配以重用来提高性能。
图片的加载任务会与activity或者Fragment的生命周期绑定,当界面执行onStop时自动暂定,而当执行onStart时又会自动重新开启,同样的,动态Gif图的加载也是如此,以用来节省电量,同时Glide会对网络状态做监听,当网络状态发生改变时,会重启失败的任务,以减少任务因网络连接问题而失败的概率。

④特性

i>感知生命周期

Glide 在加载资源的时候,如果是在 Activity、Fragment 这一类有生命周期的组件上进行。 当 Activity、Fragment 等组件进入不可见,或者已经销毁的时候,Glide 会停止加载资源。 Application 的生命周期贯穿整个应用,所以 applicationManager 只有在应用程序关闭的时候终止加载。
所以尽量不要在非 UI 线程使用 Glide 加载图片,尽量使用 Activity、Fragment 等带有生命周期的组件配合 Glide 使用。

ii>预览图

为加快加载速度,提高体验,优先加载预览图。

2)Android-Universal-Image-Loader

图片加载。
已停止维护。

3)Picasso

图片加载。

4)Fresco

①概念

图片加载。
采用匿名共享内存来保存图片,也就是Native堆,有效的的避免了OOM,功能强大,但是库体积过大。

②场景

适合用在对图片依赖比较大的App中。

③整体架构

【Android学习】Android常用框架_第1张图片
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组成了生产者与消费者模式。

5)picasso-transformations

为Picasso提供多种图片变换,让图片呈现不同的形状。

6)glide-transformations

综合Glide,让图片呈现不同的形状。

7)android-gpuimage

图片处理。基于OpenGL的Android过滤器,将GPUImage iOS移至Android。

3,网络请求

1)Android Async HTTP

Android异步HTTP库

2)AndroidAsync

异步Socket,HTTP(客户端+服务器),WebSocket,和socket.io库。基于NIO而不是线程。

3)OkHttp

一个Http与Http/2的客户端

①概念

支持HTTPS。缓存、异步请求、同步请求。协议类型是Http/1.0, Http/1.1, SPDY, Http/2.0, WebSocket,网络传输使用的是封装的Socket,数据读写使用的NIO(Okio)。

SPDY协议类似于HTTP,但旨在缩短网页的加载时间和提高安全性。
SPDY协议通过压缩、多路复用和优先级来缩短加载时间。

②子系统层级结构

【Android学习】Android常用框架_第2张图片
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黑名单。

4)Retrofit/Retrofit2

①概念

类型安全的Http客户端。
RetrofitUtils:retrofit网络工具类。

②使用

Retrofit使用注解+java接口来定义后台服务API接口

③原理——Java的动态代理

Retrofit充当了一个适配器(Adapter)的角色:用注解来描述一个HTTP请求,将一个HTTP请求抽象成一个Java接口,然后用了Java动态代理的方式,动态的将这个接口的注解“翻译”成一个HTTP请求,最后再执行这个HTTP请求。

Retrofit的功能非常多的依赖Java反射,代码中其实还有很多细节,比如异常的捕获、抛出和处理,大量的Factory设计模式。

5)Volley

已被墙。
Google推出的Android异步网络请求框架和图片加载框架。

①概念

支持HTTPS。缓存、异步请求,不支持同步请求。协议类型是Http/1.0, Http/1.1,网络传输使用的是 HttpUrlConnection/HttpClient,数据读写使用的IO。

6)okhttp-OkGo(在用)

7)第三方消息推送

①JPush(极光推送)

获取JPush推送ID:

 String regId = JPushInterface.getRegistrationID(context);  

4,网络解析

1)Gson

一个Java序列化/反序列化库,可以将JSON和java对象互相转换

2)Jackson

Jackson可以轻松地将Java对象转换成json对象和xml文档,同样也可以将json、xml转换成Java对象

3)Fastjson

Java上一个快速的JSON解析器/生成器

4)HtmlPaser

一种用来解析单个独立html或嵌套html的方式

5)Jsoup

一个以最好的DOM,CSS和jQuery解析html的库

5,数据库

1)OrmLite

JDBC和Android的轻量级ORM java包

2)Sugar

用超级简单的方法处理Android数据库

3)GreenDAO

一种轻快地将对象映射到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语句。
具体包括:

i>DaoMaster

持有数据库对象(SQLiteDatabase) ,并管理一些DAO类(不是对象)。
能够创建和删除数据库表
它的内部类OpenHelper和DevOpenHelper是SQLiteOpenHelper的实现类,用于创建SQLite数据库的模式。

ii>DaoSession

管理制定模式下所有可用的DAO对象。
能对实体进行插入、加载、更新、刷新、删除操作。

iii>DAO

每个实体都有一个DAO,相对于DaoSession,它有更多的方法,比如:加载全部、InsertTx

iv>Entity

可持久化的对象,由generator 生成。相当于数据库中的一张表,所有字段都是使用标准的Java对象的属性。

4)ActiveAndroid

以活动记录方式为Android SQLite提供持久化

5)SQLBrite

SQLiteOpenHelper 和ContentResolver的轻量级包装

6)Realm

移动数据库:一个SQLite和ORM的替换品

6,依赖注入

1)ButterKnife(已使用)

①概念

将Android视图和回调方法绑定到字段和方法上。
ButterKnife是一个专注于Android系统的View注入框架,可以减少大量的findViewById以及setOnClickListener代码。
具体用法查看GitHub。

②优点

  1. 强大的View绑定和Click事件处理功能,简化繁琐的代码编写
  2. 可以支持Adapter中的VIewHolder绑定问题
  3. 采用编译时通过注解生成代码,对运行时没有侵入,对比反射方式,效率倍高
  4. 代码清晰,可读性强
    代替了传统的反射机制:反射影响App性能,造成卡顿,并且会产生大量的临时对象,频繁的引发GC。

③原理(Java Annotation Processing技术)

Java Annotation Processing是javac中用于编译时扫描和解析Java注解的
Annotation Processing是在编译阶段执行的,它的原理就是读入Java源代码,解析注解,然后生成新的Java代码。新生成的Java代码最后被编译成Java字节码,注解解析器(Annotation Processor)不能改变读入的Java 类,比如不能加入或删除Java方法

在Java代码编译成Java字节码的时候就已经处理了@Bind、@OnClick(ButterKnife还支持很多其他的注解)这些注解了。

2)Dagger2

一个Android和java快速依赖注射器。

3)AndroidAnotations

快速安卓开发。易于维护

4)RoboGuice

Android平台的Google Guice。Android上第一个依赖注入框架,已不再受支持。

7,图表

1)WilliamChart

创建图表的Android库

2)HelloCharts

兼容到API8的Android图表库

3)MPAndroidChart(已使用)

一个强大的Android图表视图/图形库。

①X轴坐标线显示不全问题

对于LineChart:

XAxis xl = lineChart.getXAxis();
xl.setSpaceBetweenLabels(1)

对于BarChart:

XAxis xAxis = barChart.getXAxis();
xAxis.setSpaceMax(1);

②数据刷新

barChart.notifyDataSetChanged();
barChart.invalidate();

8,后台处理

1)Tape

一个轻快的,事务性的,基于文件的FIFO的库

1)Android Priority Job Queue

一个专门为Android轻松调度任务的工作队列

9,事件总线

1)EventBus(已使用)

安卓优化的事件总线,简化了活动、片段、线程、服务等的通信。

①作用

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) {//接收方(记得写注册和取消注册)
    ...
}

⑤原理

观察者模式。
【Android学习】Android常用框架_第3张图片

2)Otto

一个基于Guava的增强的事件总线

10, 响应式编程

1)RxJava

①概念

JVM上的响应式扩展。
是一个异步的、基于事件的程序的库。

②优点

逻辑简洁。

③异步

异步实现:观察者模式。

④线程控制 —— Scheduler (线程调度器)

在不指定线程的情况下, RxJava 遵循的是线程不变的原则,即:在哪个线程调用 subscribe(),就在哪个线程生产事件;在哪个线程生产事件,就在哪个线程消费事件。如果需要切换线程,就需要用到 Scheduler (调度器)。

⑤事件序列变换功能

将事件序列中的对象或整个序列进行加工处理,转换成不同的事件或事件序列。
实质上都是针对事件序列的处理和再发送。

⑥场景

与 Retrofit、RxBinding 的结合使用;
其他异步操作。

RxBinding 是 Jake Wharton 的一个开源库,它提供了一套在 Android 平台上的基于 RxJava 的 Binding API。所谓 Binding,就是类似设置 OnClickListener 、设置 TextWatcher 这样的注册绑定对象的 API。

2)RxJavaJoins

为RxJava提供Joins操作

3)RxAndroid

Android上的响应式扩展,在RxJava基础上添加了Android线程调度

4)RxBinding

提供用RxJava绑定Android UI的API

5)Agera

Android上的响应式编程

11,Log框架

1)Logger(已使用)

简单,漂亮,强大的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和文件两种日志记录输出方式。

2)Hugo

在调试版本上注解的触发方法进行日志记录

3)Timber

一个小的,可扩展的日志工具

4)Bugly

腾讯推出的一款免费崩溃日志收集统计sdk,可直接通过gradle依赖。
使用很简单,是目前国内免费软件中功能最强大的一款。

12,测试框架

1)Mockito

Java编写的Mocking单元测试框架

2)Robotium

Android UI 测试

3)Robolectric

Android单元测试框架

13,调试框架

1)Stetho

调试Android应用的桥梁,使得可以利用Chrome开发者工具进行调试

14,性能优化

1)LeakCanary

内存泄漏检测工具

2)ACRA

Android应用程序崩溃报告

15,弹框

1)OptionFrame(已使用)

一款Android弹出框、对话框、Dialog、popuwindow。

2)CircleProgressDialog(已使用)

圆形等待弹框。

16,其它功能

1)AndPermission(已使用)

Android6.0以后需要加入权限的时候询问用户。

2)FileDownloader(已使用)

文件下载框架。
注意: 使用下载文件之前,先:FileDownloader.setup(Context)

3)扫一扫

①Android Zxing

通过集成Google–zxing库实现扫一扫功能。

②yuzhiqiang1993/zxing

第三方资源。基于zxing的扫一扫,集成简单,速度快,可配置颜色,还有闪光灯,解析二维码图片,生成二维码等功能。

17,其它控件

1)SwitchButton(已使用)

2)banner(已使用)

图片轮播。

3)CircleProgress(已使用)

各种样式的圆形进度条。

4)SignatureView(已使用)

手写签名控件。

5)PullToRefresh

①概念

开发者可以使用 PullToRefresh 对各种控件实现下拉刷新或者上拉加载以及可以自定义刷新和加载部分的视图。

目前支持:ScrollView,ListView,WebView,RecyclerView。
对于单个控件,需要使用pullToRefreshLayout的功能,外层可包裹ScrollView。
取消上拉加载界面:pullToRefreshLayout.setCanLoadMore(false);
空列表显示:app:view_empty="@layout/layout_empty",但是并不好用。列表为

6)AndroidPicker

安卓选择器类库,包括日期选择器、时间选择器、单项选择器、双项选择器、城市地址选择器、车牌号选择器、数字选择器、星座选择器、生肖选择器、颜色选择器、文件选择器、目录选择器等,可自定义顶部及底部界面,可自定义窗口动画。

你可能感兴趣的:(移动开发)