ButterKnfie+Dagger2基本使用

一. ButterKnfie

ButterKnife(黄油刀)是一个专注于Android系统的View注入框架,以前总是要写很多findViewById来找到View对象,有了ButterKnife可以很轻松的省去这些步骤。

ButterKnfie依赖导入:
implementation ‘com.jakewharton:butterknife:8.8.1’
annotationProcessor ‘com.jakewharton:butterknife-compiler:8.8.1’

通过ButterKnfie寻找控件以及点击事件处理,代码如下:

 @BindView(R.id.bt1)
    public Button bt1;
    @BindView(R.id.bt2)
    public Button bt2;

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

    @OnClick({R.id.bt1,R.id.bt2})
    public void onclick(View view){
        int id = view.getId();
        if (id == R.id.bt1){
            bt1.setText("点击了按钮1");
        }else if (id == R.id.bt2){
            bt2.setText("点击了按钮2");
        }
    }

二. Dagger2

减少样板代码,提高重用性、测试性、可维护性.
用@Inject写到对象类的构造函数上面,要用的时候直接注入对象,避免new对象,造成强耦合。且可以加上注释@Singleton形成单例。
以@module和@provides为基础,可以任意注入对象,且可以带参操作。Module里面若是要有其他Module,要在includes里写好,@Module除了include,还有injects参数指定注入位置,library指定是否需要外部库,complete是否是完整module(含有外部module依赖则不完整)。最后在注入目的地,通过ObjectGraph(对象图表}形成依赖关系,具体操作方式,ObjectGraph对象,并调用方法create(Module).inject(注入对象),则可以直接用@inject注入目标对象类里。

Dagger2依赖导入:
implementation ‘com.google.dagger:dagger : 2.19’
annotationProcessor ‘com.google.dagger:dagger-compiler : 2.19’

Dagger2自定义类要处理的方法代码如下:

public class ShowInjectUtils {

    @Inject
    public ShowInjectUtils(){
    
    }

    public void show(){
        Log.e("###","使用show方法");
    }

}

Dagger2接收要注入的对象在Activity中的代码:

	@Inject
    public ShowInjectUtils showInjectUtils;
    @Inject
    public ShowModulesUtils showModulesUtils;

    private Button bt1;
    private Button bt2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        DaggerShowCompont.builder().build().inject(this);
        DaggerShowModulesCompont.builder().showModules(new ShowModules()).build().inject(this);
        init();
    }

    private void init(){
        bt1 = findViewById(R.id.bt1);
        bt1.setOnClickListener(this);
        bt2 = findViewById(R.id.bt2);
        bt2.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        if (R.id.bt1 == v.getId()){
            showInjectUtils.show();
        }else if (R.id.bt2 == v.getId()){
            showModulesUtils.show();
        }
    }

还需要一个Component去声明注入的位置,代码如下:

@Component
public interface ShowCompont {
    void inject(MainActivity activity);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值