您的位置:首页 > 移动开发 > Android开发

Android Dagger2简单入门

2016-12-23 01:17 696 查看
一、什么是dagger2?

Dagger2 是为Android和Java平台提供的一个完全静态的,在编译时进行依赖注入的框架。我们在做andriod开发的时候,一个Activity里面通常会实例化很多的类,才能使用这些的类中的方法和字段,通常,一个类很多Activity都会用到,我们就会在每个acitivity里面实例化该类。这样导致的问题就是,Activity会很依赖这些类,导致程序的耦合严重,不便于我们开发和维护。我们能有什么办法不去重新实例化这些类呢?要是这些类能直接在Activity中使用该多好。这时候就需要一个容器,我们将这些类放进这个容器,需要使用类的时候直接去容器取就好了,这样,我们就从依赖这个类到依赖这个容器了,实现了解耦。Dagger2正是为此而生,Dagger2框架就创造了这个容器,从此,我们的代码就变得更简洁了,程序间的耦合也减少了,程序变得容易开发和维护了。想想就有些小激动,是不是想赶快学会这门技术呢?

于是,我们去找度娘,我们去Google,发现关于dagger2的博客也有不少,但总是看得云里雾里,自己想入手写个demo,发现资料不足,最令人费脑的是,第一次看到dagger2的代码,第一反应是这是什么玩意儿,有点难以理解。但是dagger2能实现程序的解耦,想想还是蛮诱惑的,不弄懂dagger2心里就不踏实,弄懂dagger2后,以后写代码如鱼得水,想想还真有点小激动。

二、了解dagger2!

在我们准备实现dagger2的demo前,我们总想着要是能有一个关于dagger2的官方demo能在本地运行起来并能调试该多好啊,提前看下dagger2真正运行起来的效果,心里会踏实些,也会给自己多些信心去实现。dagger2目前由google维护,所以找demo这样的事情,我建议还是去google家找比较靠谱,至于平台嘛,当然是github啦。dagger2官方demo地址: https://github.com/google/dagger 。我们只需关注Android这块的介绍就OK啦。比如打开链接,你关注这里就好了,关于Android
Studio gradle的配置。



另外,Android 关于dagger2的官方demo位置在这里啦。



你可以把android-sample里面的代码download下来,复制到自己新建的android工程里面,运行看看哦!

三、运行google官方 dagger2 Demo!

1、dagger2 开发环境配置

1)Android Studio新建Android工程,配置project的build.gradle文件

ext.kotlin_version = '1.0.1-2'

classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"




2)配置app模块的build.gradle文件

apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'

compile 'com.google.dagger:dagger:2.2'
kapt 'com.google.dagger:dagger-compiler:2.2'
provided 'javax.annotation:jsr250-api:1.0'




3)同步改动的代码或Rebuild Project。这样,dagger2的开发环境就配置好了。



2、导入google官方dagger2 demo代码

1)将官方demo下的simple文件夹及里面的文件复制到工程里,你会发现这里可能报错



因为DaggerDemoApplication_ApplicationComponent文件是通过dagger2框架自动生成的,你需要重新Rebuild Project或是Make Project即可。

2)配置Manifest文件,配置自己的DemoApplication,修改默认启动Activity为HomeAcitivity



3)运行工程,你就会在日志栏里看到打印信息

Log.d("HomeActivity", locationManager.toString());

四、理解google官方dagger2 demo并尝试造轮子!

1、理解dagger2的几个注解

1)@Moudle 用Moudle标注的类是专门用来提供依赖的

2)@Provides 用Provides来标注一个方法,该方法可以在需要提供依赖时被调用,从而把预先提供好的对象当做依赖给标注@Injection的变量赋值。@Provides通常和@Moudle配合使用,用来标注Moudle里面的方法

3)@Inject Inject主要有两个作用,一是使用在构造函数上,将相关类实例化提供依赖,二是使用在需要使用的变量上提供依赖

4)@Component Component一般用来标注接口,被标注了Component的接口在编译时会产生相应类的实例来作为提供依赖方和被需要依赖方的桥梁,把相关依赖注入其中

2、从demo中理解四个dagger2的注解关键字

1)我们先来看AndroidMoudle类



AndroidMoudle类使用了@Moudle关键字,类里面使用了@Provides关键字。说明AndroidModule类用来提供依赖,其中提供了获取application单例和获取定位管理类单例方法用来提供给需要使用的类依赖。

2)接着看DemoApplication类



其中使用了@Component和@Inject关键字。@Component中的moudles指定到AndroidMoudle类,接口中的方法分别依赖到HomeActivity、DemoActivity以及DemoApplication。说明ApplicationComponent接口在这里做了桥梁的作用,如果HomeActivity注入了该接口,则说明在HomeActivity中就可以用@Inject关键字使用AndroidMoudle中提供出来供依赖的方法或是单例类。同理,如果DemoApplication中注入了该接口,则说明在DemoApplication类中也可以使用AndroidMoudle中提供出来依赖的方法或是单例类。该例子的DemoApplication在onCreate的时候,通过component().inject(this)注入了该接口,所以它能@Inject
locationManager,从而使用该locationManager单例类。

注意:DaggerDemoApplication_ApplicationComponent是根据dagger2的代码框架自动生成的,当你完成AndroidMoudle类并做好了@Component连接,Rebuild Project或是Make Project即可生成该类。

3、开始造自己轮子吧

新建Car类

public class Car {

@Inject
public Car(){

}

public String use(){
return "老司机开车咯";
}

}


新建Driver类

public class Driver {

@Component(modules = {TransportModule.class})
public interface TransportComponent{
void inject(Driver driver);
void inject(MainActivity mainActivity);
}

TransportComponent transportComponent;

@Inject
Car car;

@Inject
public Driver(){
transportComponent = DaggerDriver_TransportComponent.builder()
.transportModule(new TransportModule())
.build();
transportComponent.inject(this);
}

public String driveCar(){
return car.use();
}
}


新建TransportMoudle类

@Module
public class TransportModule {

@Provides
Driver provideDriver(){
return new Driver();
}

@Provides
Car providerCar(){
return new Car();
}
}


MainAcitivity依赖

public class MainActivity extends AppCompatActivity {

@Inject
Driver driver;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

TextView tvShow = (TextView) findViewById(R.id.tvShow);

Driver.TransportComponent transportComponent = DaggerDriver_TransportComponent.builder()
.transportModule(new TransportModule())
.build();

transportComponent.inject(this);

tvShow.setText(driver.driveCar());
}
}


运行效果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android dagger2