zoukankan      html  css  js  c++  java
  • Android Dragger2快速入门浅析

    定Dagger2的基本介绍:
    dagger2是一个依赖注入框架,在编译期间自动生成代码,负责依赖对象的创建。

    使用Dagger2的好处:
    为了进一步解耦和方便测试,我们会使用依赖注入的方式构建对象 (不使用 new 来创建依赖对象)。在mvp中,presenter层会持有view和model层的依赖,依赖注入主要用于解耦,通过依赖注入创建对象,不再使用new来创建对象。

    Dagger的常用注解:
    @Inject
    1.构造器注入(有多个构造器,只能标注其中一个)

    2.属性注入(被注入的属性不能用private修饰)

    3.方法注入(依赖需要this对象的时刻可以提供安全的this对象)

    @Component
    Dagger2是通过component来完成依赖注入的,一般定义component通常使用接口定义,用@Component注解。
    两种定义方法:
    void inject(目标类obj)

    Dagger2会从目标类开始查找@Inject注解,自动生成依赖注入的代码,调用inject可完成依赖的注入。

    Object getObj();

    这种方式一般为其他Component提供依赖。

    @Module
    @module标记在类的上面
    在@Component中指定Module(@Component = obj.class)
    具体来说:此注解里面全是方法,用于对外提供对象,自己定义方法,方法上使用@Provides。自定义一个类,以Module结尾,用@Module注解。
    @Provodes
    @Provodes标记在方法的上面
    @Qualifier和@Named
    @Qualifier是限定符,而@Named则是基于String的限定符

    当我有两个相同的依赖(都继承某一个父类或者都是先某一个接口)可以提供给高层时,那么程序就不知道我们到底要提供哪一个依赖,因为它找到了两个。
    这时候我们就可以通过限定符为两个依赖分别打上标记,指定提供某个依赖。

    @Qualifier不是直接注解在属性上的,而是用来自定义注解的。

    不论是@Qualifier还是@Named必须成对出现,否则报错。

    @PerActivity
    限定对象的生命周期和Activity一样。一般应用于自定义的Component上。

    @Singleton
    标记为单例模式,如果在自定义Module中使用了此注解,在自定义的Component上也要使用该注解。

    一个简单的DaggerDemo

    我用的android studio的版本是3.13版本。
    build.app(Module:app)的配置:

    compileOnly 'org.glassfish:javax.annotation:10.0-b28'
    implementation 'com.google.dagger:dagger:2.12'
    annotationProcessor 'com.google.dagger:dagger-compiler:2.12'

    首先创建一个实体类User:

    public class User {
        public String name;
        public User(){
     
        }
        public User(String name){
            this.name = name;
        }
    }

    然后创建android MVP模式中的presenter:DaggerPresenter

    public class DaggerPresenter {
        DaggerActivity activity;
        User user;
     
        public DaggerPresenter(DaggerActivity activity,User user){
            this.user = user;
            this.activity = activity;
        }
        public void showUserName(){
            activity.showUserName(user.name);
        }
    }

    创建ActivityModule类

    @Module
    public class ActivityModule  {
        private DaggerActivity activity;
        public ActivityModule(DaggerActivity activity){
            this.activity = activity;
        }
        @Provides
        public DaggerActivity provideActivity(){
            return  activity;
        }
        @Provides
        public User provideUser(){
            return  new User("user from ActivityModule");
        }
        @Provides
        public DaggerPresenter provideDaggerPresenter(DaggerActivity activity,User user){
            return new DaggerPresenter(activity,user);
        }
    }

    最后创建DaggerActivity

    public class DaggerActivity extends AppCompatActivity {
        private static final String TAG ="DaggerActivity";
        TextView text;
        @Inject
        DaggerPresenter presenter;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            text = (TextView)findViewById(R.id.text);
            inject();
            presenter.showUserName();
        }
        private void inject(){
            DaggerActivityComponent.builder().activityModule(new ActivityModule(this)).build().inject(this);
        }
        public void showUserName(String name){
            text.setText(name);
        }
    }

    然后布局文件就是一个TextView,运行成功后界面会显示user from ActivityModule.

  • 相关阅读:
    Sqlserver根据条件去除重复数据并且留下的是最大值数据
    C# Linq及Lamda表达式实战应用之 GroupBy 分组统计
    MVVM模式WPF的ComboBox数据绑定,使用Dictionary作为数据源
    C# System.Timers.Timer定时器的使用和定时自动清理内存应用
    SQL优化策略
    只要不放弃,总有出头之路
    2 Python基础
    4 动态库和静态库
    1 VS常用快捷键
    2 C语言环境、编译
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/10241046.html
Copyright © 2011-2022 走看看