依赖注入ButterKnife,Android Annotations,Dagger2
来源:互联网 发布:linux查看oracle日志 编辑:程序博客网 时间:2024/05/16 09:03
为什么使用开源框架
- 1.提高开发速度
- 2.提高开发质量
选择开源框架的原则
- 1.聚合性框架一定要放弃,例如Afinal,xUtils
*大而全的框架容易导致牵一发而动全身,可读性差,偶合性高,难扩展. - 2.last commit超过一年以上或者issues一大堆没有fix的框架不要用.
- 3.选择活跃度和人气高的项目
- ## 依赖注入
1.1依赖注入_概念
依赖(Dependency)
- 如果在ClassA中用到了ClassB的实例,我们通常会直接new一个ClassB的对象,这种情况称为调用者ClassA对被调用者ClassB有一个依赖
- 例如下面的代码中HRSystem就依赖与Person.
示例代码中Person这种直接初始化的方式也叫Hard Init方式,弊端在于两个类之间不够独立,如果我们更改了Person的构造函数,
所有使用到Person初始化方法的代码都要进行修改.public class HRSystem { public static void main(String[] args) { Person person = new Person(); }}
依赖注入(DI:Dependency Injection):
指程序运行过程中,调用者(HRSystem)需要被调用者(Person)的辅助,但是创建被调用者(Person)的工作不再由调用者(HRSystem)来完成,
因此称为控制反转(IOC:Inversion of Control),而是由相关的容器控制程序将被调用者(Person)的对象在外部创建出来并注入到调用者(HRSystem)的引用中public class HRSystem { @Inject Person person; public static void main(String[] args) { }}
为什么要使用依赖注入
- 依赖注入是实现控制反转的方式之一(另一方式是依赖查找),目的就是为了让调用者和被调用者之间解耦
- 可以注入依赖的模拟实现,使得测试变得更加简单.
1.2依赖注入_Butterknife
- 主页: https://github.com/JakeWharton/butterknife
- 用途: 主要用来简化各种初始化控件的操作
配置:
- 在app/build.gradle文件中dependencies节点添加如下代码
- compile ‘com.jakewharton:butterknife:7.0.1’
- compile ‘com.jakewharton:butterknife:8.4.0’
- 在Android Studio中点击 File–>Settings–>Plugins–>Browse repositories,搜索Android ButterKnife Zelezny插件,安装成功以后重启Android Studio.
- 在布局文件中添加控件的时候,所有需要在Activity/Fragment代码中进行控制的控件都要添加id属性
- 在Activity/Fragment 代码中,将鼠标放在布局文件的引用上(即R.layout.activity_main中的activity_main上面),此时按快捷键Alt + Insert或鼠标右键
选择Generate - 在弹出的菜单中选择Generate ButterKnife Injections,此时会再次弹出一个对话框
- 新的对话框中点击confirm后直接生成控件的引用,代替findViewById
- 如果需要处理控件的点击事件,可以选择对应控件的OnClick复选框.
- 如果是ListView的Item视图,还可以选择左下角的Create ViewHolder复选框,生成ViewHolder静态类.
- 在app/build.gradle文件中dependencies节点添加如下代码
技巧
在AndroidStudio\plugins\android\lib\templates\gradle-projects\NewAndroidModule\recipe.xml.ftl中添加如下代码,以后新创建的工程默认会添加
Butterknife依赖:<dependency mavenUrl="com.jakewharton:butterknife:7.0.1" />
1.3依赖注入_AndroidAnnotations
- 主页: http://androidannotations.org/
- 用途:
- 使用依赖注入Views,extras,System Service,resources
- 简化线程模型
- 事件绑定
- REST Client
配置:
在project/build.gradle 文件中按下图所示添加代码:
mavenCentral() classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' mavenCentral() mavenLocal()
在app/build.gradle 文件中按下图所示添加代码:
apply plugin: 'android-apt' apt { arguments { androidManifestFile variant.outputs[0]?.processResources?.manifestFile } } apt "org.androidannotations:androidannotations:4.0.0" compile "org.androidannotations:androidannotations-api:4.0.0"
注意事项:
* Manifest中注册的activity要在原类名后追加下划线”_”* 使用注解的控件和方法不能使用private修饰符 * 大型项目并不适用
1.4依赖注入_Dagger2
主页: https://github.com/google/dagger
历史:
- Dagger1是由Square公司受到Guice(https://github.com/google/guice)启发创建的依赖注入框架.
- Dagger2是Dagger1(https://github.com/square/dagger)的分支,由谷歌开发.该项目受到了
Auto项目(https://github.com/google/auto)的启发 - Dagger2的优点
- 没有使用反射,图的验证、配置和预先设置都在编译的时候执行
- 容易调试,完全具体地调用提供和创建的堆栈
- 更高的性能,谷歌声称他们提高了13%的处理性能
- 代码混淆,使用派遣方法,就如同自己写的代码一样
配置:
- 在project/build.gradle 文件中按下图所示添加代码: classpath ‘com.neenbedankt.gradle.plugins:android-apt:1.8’
在app/build.gradle 文件中按下图所示添加代码:
* apply plugin: 'com.neenbedankt.android-apt'* compile 'com.google.dagger:dagger:2.2'* apt 'com.google.dagger:dagger-compiler:2.2'* provided 'org.glassfish:javax.annotation:10.0-b28'
- 在project/build.gradle 文件中按下图所示添加代码: classpath ‘com.neenbedankt.gradle.plugins:android-apt:1.8’
主要的注解:
- @Provides: 用来修饰方法,方法的返回类型就是所提供的依赖类型,可以简单的把方法的返回值理解为我们通常要new出来的对象.
- @Provides方法都会用provide作为前缀
- @Module: 所有的@Provides方法都必须放到一个Moudle中,一个Moudle就是使用@Moudle修饰的类,可以简单的理解为一个持有各种
对象的仓库.用来给@Component组件提供实例化的对象.- Android中有三种Module:ApplicationModule,ActivityModule,UserModule,分别提供整个应用级别的(只生成一个该组件的实例),
Activity级别的,用户级别的Module。 - @Module类都用Module作为后缀
- Android中有三种Module:ApplicationModule,ActivityModule,UserModule,分别提供整个应用级别的(只生成一个该组件的实例),
- @Inject: 通常在需要依赖的地方使用这个注解,简单的理解为声明一个对象
- @Component 它是@Inject和@Module的桥梁,它的主要作用就是连接这两个部分.
- 我们必须用@Component注解一个接口,为该注解传入Module类,或者添加其依赖的组件
- @Component注解的接口或抽象类以Component为后缀
- @Component的实现类
- @Component注解的接口或抽象类,Dagger将会为该接口或者抽象类生成一个实现,这个实现的命名是在接口或抽象类前面加上Dagger,如MyComponent生成的实现是DaggerMyComponent
- @Provides: 用来修饰方法,方法的返回类型就是所提供的依赖类型,可以简单的把方法的返回值理解为我们通常要new出来的对象.
使用步骤:
创建Module,并在其中创建Provides.示例代码:
@Modulepublic class MainActivityModuel { @Provides User provideUser(){ return new User("zhangsan", 12,"18612345678"); }}
创建Component.示例代码:
@Component(modules = MainActivityModuel.class)public interface MainActivityComponent { void inject(MainActivity activity);}
Rebuild工程,生成对应的以Dagger开始的工具类
利用对应的以Dagger工具类初始化,并注入对象.示例代码:
public class MainActivity extends AppCompatActivity { @Inject User user; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); MainActivityComponent component = DaggerMainActivityComponent.builder().mainActivityModuel(new MainActivityModuel()).build(); component.inject(this); }}
- 依赖注入ButterKnife,Android Annotations,Dagger2
- 【Android】【Dagger】Dagger2 依赖注入
- Android依赖注入之Dagger2注解介绍
- Android项目使用Dagger2进行依赖注入
- Android中使用Dagger2进行依赖注入
- Android 依赖注入框架 Dagger2使用
- Android——Dagger2依赖注入框架
- android Dagger2依赖注入框架总结
- Dagger2-Android依赖注入框架的学习
- Android依赖注入:Dagger、RoboGuice和ButterKnife
- Android Studio 依赖注入框架 butterknife
- Android依赖注入:Dagger、RoboGuice和ButterKnife
- Android依赖注入:Dagger、RoboGuice和ButterKnife
- Android ButterKnife依赖注入框架简单使用
- Android依赖注入:Dagger、RoboGuice和ButterKnife
- Dagger2依赖注入框架
- 依赖注入Dagger2详解
- 依赖注入--Dagger2
- document.onreadystatechange实现加载页面。
- FileNotFoundException:startup failed due to previous errors报错解决
- arcgis 整理1
- 135-----array_key_exists
- form表单重置
- 依赖注入ButterKnife,Android Annotations,Dagger2
- 树状数组模板
- 【c++】常量
- creat clent socket
- 《InsideUE4》UObject(三)类型系统设定和结构
- python安装wordcloud
- Google 发布 Android 性能优化典范
- 关于多态的用法测试
- 模板方法设计模式