ButterKnife和dagger2

本文介绍了ButterKnife和Dagger2这两个Android开发中的注解库。ButterKnife是一个用于简化视图查找和事件处理的框架,通过注解避免了大量findViewById代码,且性能影响极小。Dagger2则是一个强大的依赖注入框架,通过注解实现模块解耦,降低了代码维护难度。文章详细讲解了两个库的使用方法,包括依赖添加、注解使用和实例操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ButterKnife

注于Android系统的View注入框架,当一个布局十分复杂时,需要引入执行大量的findViewById代码来找到View的对象,有了ButterKnife可以很轻松的省去这些步骤。是大神JakeWharton的力作,目前使用很广。最重要的一点,使用ButterKnife对性能基本没有损失,因为ButterKnife用到的注解并不是在运行时反射的,而是在编译的时候生成新的class。项目集成起来也是特别方便,使用起来也是特别简单。

https://github.com/JakeWharton/butterknife

ButterKnife的优势

1.强大的View绑定事件和资源文件的绑定
2.使用的便捷性上,剔除了原始绑定时候的复杂性
3.由于大多数的注解都是在编译期,所以不会影响程序运行的效率
4.代码清晰,可读性相对来说要强很多
ButterKnife的使用

导入依赖:classpath 'com.jakewharton:butterknife-gradle-plugin:10.0.0’在项目的build.gradle 中添加如下代码:

buildscript {
  repositories {        
     google()      
     jcenter()
     }
     dependencies {        
        classpath 'com.android.tools.build:gradle:3.4.2'        
        classpath 'com.jakewharton:butterknife-gradle-plugin:10.0.0'      
        // NOTE: Do not place your application dependencies here; they belong        
        // in the individual module build.gradle files   
       }
  }

在module的build.gradle中添加如下代码

apply plugin: 'com.android.application'
apply plugin:'com.jakewharton.butterknife'//添加这一行
//依赖
implementation 'com.jakewharton:butterknife:10.0.0'  
annotationProcessor 'com.jakewharton:butterknife-compiler:10.0.0'

1.ButterKnife注解添加

  @BindView(R.id.btn1)    
  Button btn1;
  @BindView(R.id.tv1)    
  TextView tv;

2.在onCreate方法中绑定

@Overrideprotected void onCreate(Bundle savedInstanceState) {   
 super.onCreate(savedInstanceState);  
   setContentView(R.layout.activity_main);
       ButterKnife.bind(this);    
       getSupportFragmentManager().beginTransaction().add(R.id.fram1,new MyFragment()).commit();
       }

3.单独创建点击事件方法,使用@OnClick({R.id.tv1,R.id.btn1})注解,括号中的数组指明的是哪个组件响应点击

@OnClick({R.id.tv1,R.id.btn1})
public void Onclick(View view){
	switch(view.getId()){
	case R.id.tv1:
		 tv.setText("终于点到了");            
		 break;
	 case R.id.btn1:
		 Intent intent = new Intent(this,Main2Activity.class);            
		 startActivity(intent);            
		 break;
	}
}

4.Fragment中使用绑定方法不同,并且需要在onDestroyView中解绑

Unbinder unbinder;
@BindView(R.id.btn2)Button but2;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.frazgmentlayout1,container,false); 
    unbinder= ButterKnife.bind(this,view);    
    return view;
 }
/** 
* onDestroyView中进行解绑操作 
* */
@Override
public void onDestroyView() {    
super.onDestroyView();    
unbinder.unbind();
}
ButterKnife插件的添加可以快速绑定

下载插件 ButterKnife

dagger2

Dagger2是什么?

Dagger2是Dagger的升级版,是一个依赖注入框架,第一代由大名鼎鼎的Square公司共享出来,第二代则是由谷歌接手后推出的,现在由Google接手维护.

依赖

依赖是指某个模块A要实现某个功能需要其他模块B。最原始也最简单的的方式是在模块内new一个B的对象出来,这样会造成B的构造函数修改,需要修改A中的代码,两者耦合度非常高。

依赖注入

依赖注入是不在A中去创建 B的实例,而是让上层调用者注入一个B的对象,这样可以让模块A不再因为B的构造方法的修改而改变
举个例子:

public class ClassA{ 
       private ClassB b        
       public ClassA(ClassB b){ 
              this.b = b       
       }    
}

这里ClassA的构造函数里传了一个参数ClassB,随着后续业务增加也许又需要传入ClassC,ClassD.试想一下如果一个工程中有5个文件使用了ClassA那是不是要改5个文件?这既不符合开闭原则, 也太不软工了.这个时候大杀器Dagger2就该出场了.

public class ClassA{
@inject       
private ClassB b       
public ClassA(){    
   
	}    
}

通过注解的方式将ClassB b注入到ClassA中, 可以灵活配置ClassA的属性而不影响其他文件对ClassA的使用.

dagger2导依赖
implementation"com.google.dagger:dagger:2.16"
annotationProcessor"com.google.dagger:dagger-compiler:2.16"

dagger2基本使用

1.创建注入提供者类
2.提供者创建构造方法
3.给构造方法添加@Inject注解,表明对外提供依赖,并写个方法
public class Utils1 {
    @Inject    
    //提供给其他类使用    
    public Utils1(){    
    }    
    public void show(){
            Log.e("########","utils1---show");
           }
    }
 4.在接收注解方创建提供注解类的对象并添加@Inject注解,表明这个对象需要注入

@Inject      
  //使用其他类
  Utils1 utils1;

5.创建注解的桥梁,或者叫注入者。注入者是一个接口,需要用@Component注解,并且提供一个方法用来表示向谁注入。

@Component
//提供桥梁public interface Utils1Compont {
    void inject(Main2Activity main2Activity);
    }

6.注意到这里可以锤了
7.锤过之后如果不报错可以在build中找到如下内容
在这里插入图片描述

8. 在调用类中加载Dagger,然后就可以调用了
DaggerUtils1Compont.builder().build().inject(this);

dagger2基本使用2

跟上个方法大致一样
但是不创建单个类了,在这里要创建一个仓库类,用来存放需要使用的类,
这里需要用@Module来注解表示这是仓库

@Module
public class UserModule {
    public UserModule() {
    }
    @Provides    
    public Utils1 useUtils() {           
       Log.e("######","仓库show");        
       return new Utils1();    
    }
 }

带仓库的dagger也需要一个接口桥梁,
这个桥梁注解需要参数@Component(modules={UserModule.class})

@Component(modules={UserModule.class})
public interface Utils1CompontWithModule {
//提供桥梁
void injectWithmodule(MainActivity mainActivity);
}

完成以上操作 仍然是锤一下
在调用类中加载Dagger,然后就可以调用了,加载Dagger时需要将仓库带入

DaggerUtils1CompontWithModule.builder().userModule(new UserModule()).build().injectWithmodule(this);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值