零屏框架总结
来源:互联网 发布:斯坦福大学知乎 编辑:程序博客网 时间:2024/05/19 03:20
- 零屏简介
- 使用技术
- 1 MVP架构
- 2 Dagger2使用
- Dagger2使用详解
- 1添加依赖
- 2注解
- 2概念总结
- 4编译过程
- 5优缺点
- 零屏类图
1.零屏简介
零屏是一个独立apk应用,主要于卡片的形式来展示一些基本信息,比如天气、常用应用、新闻、壁纸和运用内容等。可以做外单独的apk应用,但是它更适合的地方是集成在Launcher里面作为Launcher的负一屏,方便用户快速查看。
2.使用技术
2.1 MVP架构
零屏整体框架采用MVP架构,MVP是从MVC演进过来的,将视图和逻辑分离降低耦合。
2.2 Dagger2使用
Dagger2是一个依赖注入框架,它利用 APT在编译时生成辅助类,这些类继承特定父类或实现特定接口,程序在运行时 Dagger 加载这些辅助类,调用相应接口完成依赖生成和注入。对于MVP架构是最好的解耦工具,能充分的降低模块之间的耦合。
3.Dagger2使用详解
3.1.添加依赖
在项目build.gradle修改如下配置
dependencies { classpath 'com.android.tools.build:gradle:2.2.2' classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' }
在需要使用的module修改build.gradle
apply plugin: 'com.android.application'apply plugin: 'com.neenbedankt.android-apt'...dependencies { compile 'com.google.dagger:dagger:2.5' apt 'com.google.dagger:dagger-compiler:2.5' compile 'org.glassfish:javax.annotation:10.0-b28'}
3.2注解
Inject用来标注目标类所依赖的属性和这个属性的构造函数
目标类是实际操作的类,如:Activity引用Presenter,Activity就是目标类,Presenter是需要用Inject来标注的类
每一个被Inject标注的对象都有一个对应的工厂类
// 无参数public class TestInfo { @Inject public TestInfo() { }}// 引用InjectTestInfo testInfo;
// 有参数public class NewsPresenter extends IPresenter<INewsView> { @Inject public NewsPresenter(INewsView view) { super(view); }
为NewsPresenter 添加@Inject注解
INewsView 需要通过Module来提供
Module用来解决三方库和构造函数有特定参数的类
Modulepublic class NewsModule { INewsView mINewsView; public NewsModule(INewsView iView) { this.mINewsView = iView; } @LayoutScope @Provides public INewsView provideIPhiView() { return mINewsView; }}
此类以@Module注解
提供INewsView ,返回INewsView 对象的方法需要通过@Provides来注解,方法名可以随便定义,但一般与provide开头
不能有相同返回值的函数,如果需要可以用@Named注解来区分
Component是一个桥梁,一端是目标类,一端是目标类的实例。负责将目标类依赖的实例注入到目标类
LayoutScopeComponent(modules = {NewsModule.class}, dependencies = {AppComponent.class})public interface NewsComponent { public void inject(NewsLayout newsLayout);}
以@注解Component
将目标依赖实例注入到目标类
具体引用
public class NewsLayout extends BaseLayout implements INewsView { @Inject NewsPresenter mNewsPresenter; public NewsLayout(Context context) { super(context); } @Override public void inject() { DaggerNewsComponent.builder() .appComponent(ComponentManager.getsInstance(getContext()).getAppComponent()) .newsModule(new NewsModule(this)) .build() .inject(this); }}
inject方法中将NewsLayout依赖的对象(NewsPresenter )注入了。mNewsPresenter对象只要添加@Inject注解就可以直接使用了
build里面创建了NewsPresenter对象,Inject将创建好的对象赋值给mNewsPresenter
3.2.概念总结
Inject用来标注目标类所依赖的属性和这个属性的构造函数
目标类是实际操作的类,如:Activity引用Presenter,Activity就是目标类,Presenter是需要用Inject来标注的类
每一个被Inject标注的对象都有一个对应的工厂类
Component是一个桥梁,一端是目标类,一端是目标类的实例。负责将目标类依赖的实例注入到目标类
- Module用来解决三方库和构造函数有特定参数的类
Provides用来注解在Module中定义的函数,这些函数返回的是三方类、有参数的类(无参数的也可以)和有参数的类的参数类型。
Singleton没有创建单例的能力(不是单例),我们只需要保证ApplicationComponent只有一个实例,是Scope自定义注解的一种特例
Scope可以理解为将Module和Component统一生命周期,在使用过程中我们一般会自定义Scope
- dependencies是Component注解的一个属性,可理解为依赖继承,与Java中的继承意义类似
- Named可结合Provides提供相同返回值得函数
3.4.编译过程
为对应类创建工厂类的过程步骤如下:
步骤1:查找Module中是否存在创建该类的方法。
步骤2:若存在创建类方法,查看该方法是否存在参数
步骤2.1:若存在参数,则按从步骤1开始依次初始化每个参数
步骤2.2:若不存在参数,则直接初始化该类实例,一次依赖注入到此结束
步骤3:若不存在创建类方法,则查找Inject注解的构造函数,
看构造函数是否存在参数
步骤3.1:若存在参数,则从步骤1开始依次初始化每个参数
步骤3.2:若不存在参数,则直接初始化该类实例,一次依赖注入到此结束
3.5.优缺点
优点
对比正常使用
mNewsAdapter = new NewsAdapter(getContext());
- 对比我们之前的正常使用,减少了依赖不用再new了,而且如果构造函数发生变化也不用依次去修改每一个使用的地方
缺点
- 中间代码太多,一般会有对应的mudule和Component
- 注入对象参数值不能动态修改,遇到的问题是retrofit在common中多url问题
4.零屏类图
如下为零屏的类关系图:
- 零屏框架总结
- <零>spring框架总结系列前言
- 从零实现MVC框架之总结(9)
- Yaf零基础学习总结1-Yaf框架简介
- Yaf零基础学习总结1-Yaf框架简介
- Yaf零基础学习总结2-Yaf框架的安装
- C++总结(零)
- 计算机网络总结( 零)
- 从零手写服务端框架
- 从零手写服务端框架
- 网页编程零框架解决方案
- 零八技能总结篇
- Ambi 实习总结(零)
- 零基础学习编程总结
- [零基础学python]python开发框架
- [零基础学python]python开发框架
- Web App的零框架解决方案
- 【零】ODB - C++ 持久层框架ODB
- 引用与指针
- springboot集成redis
- [LeetCode] LFU Cache
- Recurrent Convolutional Network for Video-based Person Re-Identification 学习笔记
- 进入一个APP时对手机网络判断(使用广播和不使用广播)
- 零屏框架总结
- 一年之期
- Navigator的教程
- sdl实现计时器
- 洛谷 P3818 小A和uim之大逃离 II
- Luogu P1802 5倍经验日_KEY
- 工厂模式C++实现
- docker-machine提示This computer doesn't have VT-X/AMD-v enabled. Enabling it in the BIOS is mandatory
- (二)Redux:实现一个Store