Android开发半栈工程师Android技术知识

[包教包会]dagger2使用教程(一)最基本的用法

2018-06-06  本文已影响87人  范范范范范范

本文适用读者:已经熟练掌握Android编程,并且用过butterknife的程序员。最好是看了很多其他dagger2文章还没有学会的人。

dagger2,是什么?依赖注入框架。什么是依赖注入?咱说人话,依赖,就是需要某个东西,没有它不行。注入,把一个东西送到另一个东西里面。依赖注入啥意思?就是把需要东西送到某个地方。比如,你要写钢笔字,钢笔没水了。你需要墨水,把墨水注入到钢笔里。加墨水这个动作,就是依赖注入。在咱android上就是,你在某个Activity里面需要某个类,通过dagger2把这个类送到这个Activity里,你可以在这个Activity里使用这个类。

下面讲dagger2,打开android studio。创建一个新project。在build gradle里粘贴下面的代码,然后synk


compile'com.google.dagger:dagger:2.16'

annotationProcessor'com.google.dagger:dagger-compiler:2.16'

既然是包教包会,我们就以包子为例。

先建一个包子类,韭菜包子。

import javax.inject.Inject;

public class Baozi {
    String type = "韭菜";

    @Inject
    public Baozi() {
    }
}

和以前不一样的地方是有个“@Inject”,这是个注解,就是说,我们要送的东西,就是包子这个类。大家用过butterKinfe黄油刀吧?和butterknife那个@bind或者@bindview 很像。

MainActivity,相当于办公室,使用(食用)包子的一个场景。

我写了个按钮,点一下,能吃包子,知道什么馅的。


image.png
public class MainActivity extends AppCompatActivity {

    Button btnEat;
    @Inject
    Baozi baozi;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
//绑定       
 btnEat = findViewById(R.id.eat);
//点击事件
        btnEat.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.this, baozi.type, Toast.LENGTH_SHORT).show();
            }
        });
    }
}

包子有了,Activity是咱的办公室。现在要把包子送到办公室里。或者说把Baozi类注入到MainActivity里。点了包子外卖,由送餐员送到办公室。在dagger2里,谁是送餐员呢?他的名字叫“朱建”,英文名Component。中文意思是组件。我也不知道为什么叫component这个怪名字。记住中文名叫“朱建(组件)”,英文名叫component就好了。

创建组件,送餐员,类名是MainComponent ,要注意的是这个是个接口interface,不是类class。

import dagger.Component;

@Component()
public interface MainComponent {
    void inject(MainActivity activity);
}

函数inject,代表要注入,也就是送餐。送到什么地方呢?写到函数参数里(MainActivity activity)。

接下来按ctrl + F9,也就是build菜单下make project, Dagger2通过编译器会在某些文件夹下生成一些类。这个类就是我们的送餐员,它把我们需要的类(包子)送到需要的地方-办公室(MainActivity)。这个类的名字是Dagger+MainComponent ,DaggerMainComponent
命名方式推荐为: 目标类名+Component ,在编译后Dagger2就会为我们生成 DaggerXXXComponent 这个类
注入代码是

 DaggerMainComponent.builder().build().inject(this);

在MainActivity里写上上面这句一运行,包子就送到办公室,Baozi就注入到了MainActivity里面。好奇怪,这个类竟然不用import,请高手指点为什么。

点击“吃”按钮,toast显示“韭菜”。我们知道什么馅的了。哈哈。
这样,dagger2最简单的使用方法你已经会了。

image.png

最终代码如下:

public class MainActivity extends AppCompatActivity {

    Button btnEat;

    @Inject
    Baozi baozi;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btnEat = findViewById(R.id.eat);

        DaggerMainComponent
                .builder()
                .build()
                .inject(this);

        btnEat.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.this, baozi.type, Toast.LENGTH_SHORT).show();
            }
        });
    }
}

复习一下使用步骤

1.创建要注入的类,构造方法要加@inject
2.在你需要的地方(比如Activity里面),声明这个类时,也要加@inject
3.创建component,声明inject方法,参数是你需要用这个类的地方,比如某个Activity。不要忘了@Component()
4.按Ctrl + F9,或者build菜单下make project,生成daggerXXXComponent类。
5.在Activity里写

        DaggerXXXComponent
                .builder()
                .build()
                .inject(this);

这样你就可以使用注入的类了。

包教包会,现在dagger2最简单的用法你会不会了?不会的话,请留言,我改进文章,到能看会为止。

再说一下dagger2 的优点。为什么用dagger2?直接在Activity里面new 一个类就行了。也就是说,为啥要送餐员?直接在办公室做包子就行了。问题是,Activity可能有很多。万一这个类的构造方法发生改变,就要在每一个Activity里面重写构造方法。如果包子要改成猪肉馅的,要在每个办公室里改包子。重复很多遍。如果用dagger2,只要在要注入的类里面改就好了。只需要改一遍。

下一篇介绍dagger2更多的用法。
https://www.jianshu.com/p/807fd29283f4

上一篇下一篇

猜你喜欢

热点阅读