Dagger2的基本用法

1. androidstudio中Dagger2环境搭建

project的build.gradle添加

    dependencies {
        ... // 其他classpath
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' //添加apt命令
    }


module的build.gradle添加

    apply plugin: 'com.neenbedankt.android-apt'//添加apt命令


    dependencies {
        apt 'com.google.dagger:dagger-compiler:2.0.2' //指定注解处理器
        compile 'com.google.dagger:dagger:2.0.2'  //dagger公用api
        provided 'org.glassfish:javax.annotation:10.0-b28'  //添加android缺失的部分javax注解
    }

2.简单实例

用户登录界面
ui界面 LoginActivity中代码
    public class LoginActivity extends AppCompatActivity  implements
    ILoginView,View.OnClickListener{

    @Bind(R.id.et_name)
    EditText etName;
    @Bind(R.id.et_password)
    EditText etPassword;
    @Bind(R.id.btn_login)
    Button btnLogin;
    @Bind(R.id.btn_clear)
    Button btnClear;

    @Inject
    LoginPresenterCompl loginPresenter;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_login);
        ButterKnife.bind(this);

        DaggerMainComponent.builder().mainModule(new MainModule(this)).build().inject(this);
//        loginPresenter = new LoginPresenterCompl(this);//不引入dagger2时生成的p实例
    }

    @OnClick({R.id.btn_login, R.id.btn_clear})
    public void onClick(View view) {

        String name = etName.getText().toString().trim();
        String password = etPassword.getText().toString().trim();

        switch (view.getId()) {
            case R.id.btn_login:
                loginPresenter.doLogin(name,password);
                break;
            case R.id.btn_clear:
                loginPresenter.clear();
                break;
        }
    }

    @Override
    public void onClearText() {
        etName.setText("");
        etPassword.setText("");
        Toast.makeText(this, "登录信息被清除了", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onLoginResult(Boolean result, int code) {
            if (result){
                Toast.makeText(this, "登录成功"+code, Toast.LENGTH_SHORT).show();
            }else{
                Toast.makeText(this, "登录失败"+code, Toast.LENGTH_SHORT).show();
            }
    }
}

ILoginView中code

public interface ILoginView {

    public void onClearText();

    public void onLoginResult(Boolean result, int code);

}

ILoginPresenter中的code

public interface ILoginPresenter {

    public void clear();

    public void doLogin(String name, String password);

}

LoginPresenterCompl中的code

public class LoginPresenterCompl implements ILoginPresenter {
    private ILoginView loginView;
    private User user;

    @Inject
    public LoginPresenterCompl(ILoginView loginView) {
        this.loginView = loginView;
        user = new User("zhangsanfeng", "123");
    }

    @Override
    public void clear() {
        loginView.onClearText();
    }

    @Override
    public void doLogin(String name, String password) {

        boolean result = false;
            int code = 0;
        if (name.equals(user.getName())&& password.equals(user.getPassword())) {
            result=true;
            code = 1;
        }else{
            result = false;
            code = 0;
        }
        loginView.onLoginResult(result,code);
    }
}

User模型

public class User {
    private  String name;
    private String password;

    public User(String name, String password) {
        this.name = name;
        this.password = password;
    }
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}

MainModule

@Module
public class MainModule {

    private final ILoginView view;

    public MainModule(ILoginView view) {
        this.view = view;
    }

    @Provides
    ILoginView provideILoginView(){
        return view;
    }
}

MainComponent

@Component (modules = MainModule.class)
public interface MainComponent {

     void inject(LoginActivity activity);
}
  1. @Inject 程序会将Dagger2会将带有此注解的变量或者构造方法参与到依赖注入当中,Dagger2会实例化这个对象
  2. @Module 带有该注解的类需要对外提供依赖,其实就是提供实例化需要的参数,Dagger2在实例化的过程中发现一些参数,Dagger2就会到该类中寻找带有@Provides注解的以provide开头的需找对应的参数
  3. @Component 带有该注解的接口或抽象类起到一个关联桥梁的作用,作用就是将带有@Inject的方法或对象和带有@Module的类进行关联,只有通过该接口或抽象类才可以在实例化的时候到带有@Module中类中去寻找需要的参数,也就是依赖注入

整个demo的基本思路:

  1. 在这个示例代码中,LoginActivity中需要LoginPresenterCompl,所以在LoginActivity中定义了该对象并且通过@Inject将其注解,同时到LoginPresenterCompl的构造方法中也通过@Inject将其注解, 表明这些是需要依赖注入的.
  2. 因为在LoginPresenterCompl的构造方法需要ILoginView类型的参数,所以需要通过依赖将获取这些参数,所以就需要带有@Module注解的类用于获取需要的参数, 在@Module注解的类中通过被@Provides注解的以provide开头的方法对外提供需要的参数,一般而言有几个参数就需要有几个带有@Provides的方法。
  3. 此时还需要一个桥梁将两者联系到一起,带有@Component的接口或抽象类就起到这个桥梁的作用。注解中有一个module的值,这个值指向需要依赖的Module类,同时其中有一个抽象方法 inject(),其中的参数就是我们需要在哪个类中实例化LoginPreserentCompl,因为我们需要在LoginActivity中实例化,所以参数类型就是LoginActivity类型。 然后在Android studio中rebuild我们的项目,就会生成DaggerMainComponent类,通过
    DaggerMainComponent.builder().mainModule(new MainModule(this)).build().inject(this);
    完成我们需要的依赖注入。

猜你喜欢

转载自blog.csdn.net/pengpeng952789/article/details/69396440