午后阳光

既然世界不能用单纯的黑与白描绘,那我便用0和1去解读

【Android学习】Android常用框架

1,缓存

1)DiskLruCache

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

2,图片

1)Glide(已使用)

①概念

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

②场景

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

2)Android-Universal-Image-Loader

图片加载。
已停止维护。

3)Picasso

图片加载。

4)Fresco

①概念

图片加载。
采用匿名共享内存来保存图片,也就是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组成了生产者与消费者模式。

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协议通过压缩、多路复用和优先级来缩短加载时间。

②子系统层级结构

子系统层级结构图
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

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

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解决方案。

①使用

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<Son> 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<String> 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<String> convertToEntityProperty(String databaseValue) {
        if (databaseValue == null) {
            return null;
        }
        else {
            List<String> list = Arrays.asList(databaseValue.split(","));
            return list;
        }
    }

    @Override
    public String convertToDatabaseValue(List<String> 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<User> builder = userDao.queryBuilder();
List<User> 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<SafequalityEntity> 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<条件<B,有的是A<=条件<=B)
“gt” 相当于 >
“ge”相当于 >=
“lt” 相当于 <
“le”相当于  <=
“isNull” 为空
“notIsNull” 不为空

4)ActiveAndroid

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

5)SQLBrite

SQLiteOpenHelper 和ContentResolver的轻量级包装

6)Realm

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

6,依赖注入

1)ButterKnife(已使用)

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

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

⑤原理

观察者模式

2)Otto

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

10, 响应式编程

1)RxJava

JVM上的响应式扩展

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

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

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SunshineTan/article/details/79947900
个人分类: 移动开发
上一篇【设计模式】Android之观察者模式
下一篇【Android学习】Android系统架构
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭