一. 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);
}