app依赖详解

## 依赖注入


### 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](https://github.com/JakeWharton/butterknife "https://github.com/JakeWharton/butterknife")
* 用途: 主要用来简化各种初始化控件的操作
* 配置:
1. 在app/build.gradle文件中dependencies节点添加如下代码
* compile 'com.jakewharton:butterknife:7.0.1'
2. 在Android Studio中点击 File-->Settings-->Plugins-->Browse repositories,搜索Android ButterKnife Zelezny插件,安装成功以后重启Android Studio.
3. 在布局文件中添加控件的时候,所有需要在Activity/Fragment代码中进行控制的控件都要添加id属性
4. 在Activity/Fragment 代码中,将鼠标放在布局文件的引用上(即R.layout.activity_main中的activity_main上面),此时按快捷键Alt + Insert或鼠标右键选择Generate
5. 在弹出的菜单中选择Generate ButterKnife Injections,此时会再次弹出一个对话框
6. 新的对话框中点击confirm后直接生成控件的引用,代替findViewById
7. 如果需要处理控件的点击事件,可以选择对应控件的OnClick复选框.
8. 如果是ListView的Item视图,还可以选择左下角的Create ViewHolder复选框,生成ViewHolder静态类.


* 技巧
* 在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/](http://androidannotations.org/)
* 用途: 
1. 使用依赖注入Views,extras,System Service,resources
2. 简化线程模型
3. 事件绑定
4. REST Client
* 配置:
1. 在project/build.gradle 文件中按下图所示添加代码:

mavenCentral()
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
mavenCentral()
mavenLocal()
![logo](static/androidAnnatations_project.png)
2. 在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"
![logo](static/androidAnnatations_app.png)


* 注意事项:


* Manifest中注册的activity要在原类名后追加下划线”_”
* 使用注解的控件和方法不能使用private修饰符
* 大型项目并不适用


### 1.4依赖注入_Dagger2 
* 主页: [https://github.com/google/dagger](https://github.com/google/dagger )


* 历史: 
* Dagger1是由Square公司受到Guice([https://github.com/google/guice](https://github.com/google/guice))启发创建的依赖注入框架.
* Dagger2是Dagger1([https://github.com/square/dagger](https://github.com/square/dagger))的分支,由谷歌开发.该项目受到了Auto项目([https://github.com/google/auto](https://github.com/google/auto))的启发
* Dagger2的优点
* 没有使用反射,图的验证、配置和预先设置都在编译的时候执行
* 容易调试,完全具体地调用提供和创建的堆栈
* 更高的性能,谷歌声称他们提高了13%的处理性能
* 代码混淆,使用派遣方法,就如同自己写的代码一样
  
* 配置:
1. 在project/build.gradle 文件中按下图所示添加代码:  classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
![icon](static/dagger2_project.png)
2. 在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'
![Logo](static/dagger2_app.png)


* 主要的注解:
* @Provides: 用来修饰方法,方法的返回类型就是所提供的依赖类型,可以简单的把方法的返回值理解为我们通常要new出来的对象.
* @Provides方法都会用provide作为前缀
* @Module: 所有的@Provides方法都必须放到一个Moudle中,一个Moudle就是使用@Moudle修饰的类,可以简单的理解为一个持有各种对象的仓库.用来给@Component组件提供实例化的对象.
* Android中有三种Module:ApplicationModule,ActivityModule,UserModule,分别提供整个应用级别的(只生成一个该组件的实例),Activity级别的,用户级别的Module。
* @Module类都用Module作为后缀
* @Inject: 通常在需要依赖的地方使用这个注解,简单的理解为声明一个对象
* @Component 它是@Inject和@Module的桥梁,它的主要作用就是连接这两个部分.
* 我们必须用@Component注解一个接口,为该注解传入Module类,或者添加其依赖的组件
* @Component注解的接口或抽象类以Component为后缀
* @Component的实现类
* @Component注解的接口或抽象类,Dagger将会为该接口或者抽象类生成一个实现,这个实现的命名是在接口或抽象类前面加上Dagger,如MyComponent生成的实现是DaggerMyComponent


* 使用步骤:
1. 创建Module,并在其中创建Provides.示例代码:


@Module
public class MainActivityModuel {

   @Provides
   User provideUser(){
       return  new User("zhangsan", 12,"18612345678");
   }
}
2. 创建Component.示例代码:


@Component(modules = MainActivityModuel.class)
public interface MainActivityComponent {
   void inject(MainActivity activity);
}


3. Rebuild工程,生成对应的以Dagger开始的工具类
4. 利用对应的以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);
   }
}
某城市已经在各条道路上安装了空气温度、空气湿度、pm2.5、CO2 、光照、道路状态等传感器。部分小车安装了ETC和速度传感器,能够获得这些小车的数度和对其ETC金额进行管理。各传感数据已经汇总在服务器系统。 假设各传感器和ETC账户最小、最大阈值已由管理员设置如下: 环境指标 最小值 最大值 备注 空气温度: 10 40 空气湿度: 50 150 pm2.5 500 5000 CO2 100 600 光照 0 100 道路状态: 1 5 ETC账户余额 100 5000 现要求开发一套移动APP实现如下功能: 1、用户登录注册模块的功能 对用户账号的合法性进行判断,合法的用户允许使用智能交通系统,不合法的用户则禁止使用该系统。用户登陆注册模块能够完成用户注册、自动登录和找回密码等功能。 2、实现系统的实时环境指标动态显示功能 图1 界面原型 1)、利用给定的资源,实现该界面原型的布局,参阅环境指标界面原型图。 2)、实现空气温度、空气湿度、pm2.5、CO2 、光照、道路状态(默认1号编号道路)实时数据显示功能。 注:数据实时刷新周期为 5秒。 3)、实现报警状态警示功能,正常状态背景为绿色,警告状态为红色。 4)、点击传感器的显示区域,可以进入对应的传感器“实时曲线显示”界面。 3 实现系统车辆账户充值、查询功能和限速功能 1)、在点击充值按钮时,先检测账户余额是否超过设置的阈值,如果超过阈值就不允许充值。 2)、如果用户充值的金额加上账户余额超过了账户余额的最大阈值就提示用户充值失败,并提示出本次可以充值的最大额度。 3)、设置小车速度阈值并且显示到页面。 4)、实时监测小车的速度一旦小车速度低于小车最低速度阈值,提示用户速度过慢。一旦小车速度超过最大速度阈值强制停止小车。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值