dagger2学习笔记

享学课堂-月亮老师

  以下是观看视频时,跟着敲打的代码。遇到某些问题以及解决方法。只在添加依赖以及使用单例类在module中写代码时遇到问题。

1 dagger2基本使用

1.1 使用依赖

  注意使用的dagger的版本,不同版本dagger使用的sdk版本不同,使用不当项目会编译不过。视频中使用2.4,如果自己创建的项目也使用2.4编译会不通过。

implementation 'com.google.dagger:dagger:2.40.3'
annotationProcessor 'com.google.dagger:dagger-compiler:2.40.3'

1.2 使用dagger需要什么东西

image-20211202103509910

1.3 新建object、module、component

object
public class DatabaseObject {
}
public class HttpObject {
}
module
@Module
public class DatabaseModule {
    @Provides
    public DatabaseObject providerDatabaseObject(){
        return new DatabaseObject();
    }
}
@Module   //视频中单例类会在HttpModule上面添加@SingleTon,但是我添加后编译报错,删除了才没有问题。
public class HttpModule {
    @Provides
    @UserScope  //单例类相当于@SingleTon
    public HttpObject providerHttpObject(){
        return new HttpObject();
    }
}
component
/*
* 这是一个组件,用于,用于将对象注入到其他类中。
* */

@UserScope //单例类相当于@SingleTon
@Component(modules = {HttpModule.class, DatabaseModule.class})
public interface MyComponent {
    //参数不能用Object T多态
    void injectMainActivity(MainActivity mainActivity); //注入到MainActivity
    void injectSecActivity(SecActivity secActivity);
}
全局单例application
//需要到AndroidManifest.xml中注册
public class MyApplication extends Application {

    private MyComponent myComponent;

    public MyComponent getMyComponent(){
        return myComponent;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        myComponent = DaggerMyComponent
                .builder()
                .httpModule(new HttpModule())
                .databaseModule(new DatabaseModule())
                .presenterComponent(DaggerPresenterComponent.create())
                .build();
    }
}
注入到MainActivity中
public class MainActivity extends AppCompatActivity {

    @Inject
    HttpObject httpObject; //httpObject = new HttpObject();
    //httpObjectProvider.get()
    //module.providerHttpObject()
    //new HttpObject()

    @Inject
    HttpObject httpObject2;

    @Inject
    DatabaseObject databaseObject;

    @Inject
    Presenter presenter;

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

//        DaggerMyComponent
//                .builder()
//                .httpModule(new HttpModule())
//                .databaseModule(new DatabaseModule())
//                .build()
//                .injectMainActivity(this);
        //全局单例
        ((MyApplication)getApplication()).getMyComponent().injectMainActivity(this);

        Log.d("TAG", "onCreate: " + httpObject.hashCode());
        Log.d("TAG", "onCreate: " + httpObject2.hashCode());
        Log.d("TAG", "onCreate: " + databaseObject.hashCode());
        Log.d("TAG", "onCreate: " + presenter.hashCode());
        Button btn = findViewById(R.id.btn);
        btn.setOnClickListener((view)->{
            startActivity(new Intent(this, SecActivity.class));
        });
    }
}
public class SecActivity extends AppCompatActivity {

    @Inject
    HttpObject httpObject;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sec);

//        DaggerMyComponent
//                .builder()
//                .httpModule(new HttpModule())
//                .databaseModule(new DatabaseModule())
//                .build()
//                .injectSecActivity(this);

        ((MyApplication)getApplication()).getMyComponent().injectSecActivity(this);
        
        Log.d("TAG", "onCreate: " + httpObject.hashCode());
    }
}

2 多个component注入到同一个类中

  下列例子将MyComponent和PresentComponent类注入到MainActivity中

2.1 新建component

public class Presenter {
}
@Module
public class PresenterModule {
    @Provides
    @AppScope
    public Presenter providerPresenter(){
        return new Presenter();
    }
}
@AppScope
@Component(modules = {PresenterModule.class})
public interface PresenterComponent {
    public Presenter providerPresenter();  //与myComponent类中的注册到某个类中不一样
}

2.2 将component绑到另一个component上

  在dependency那里写。

/*
* 这是一个组件,用于,用于将对象注入到其他类中。
* 如果使用singleTon,要记住16-18条dagger
* 如果不用,自定义scope:使用dependency
* dependency和scope的使用要记住。
* 1.不同的Component上,scope不能相同
* 2.没写scope不能依赖有scoped的component
* */

@UserScope //单例类
@Component(modules = {HttpModule.class, DatabaseModule.class}
,dependencies = {PresenterComponent.class})   
public interface MyComponent {
    //参数不能用Object T多态
    void injectMainActivity(MainActivity mainActivity);
    void injectSecActivity(SecActivity secActivity);
}
自定义scope
@Scope
@Documented
@Retention(RUNTIME)
public @interface AppScope {}

2.3 activity上使用绑定完成的component

public class MainActivity extends AppCompatActivity {

    @Inject
    HttpObject httpObject; //httpObject = new HttpObject();
    //httpObjectProvider.get()
    //module.providerHttpObject()
    //new HttpObject()

    @Inject
    HttpObject httpObject2;

    @Inject
    DatabaseObject databaseObject;

    @Inject
    Presenter presenter;

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

        //全局单例
        ((MyApplication)getApplication()).getMyComponent().injectMainActivity(this);

        Log.d("TAG", "onCreate: " + httpObject.hashCode());
        Log.d("TAG", "onCreate: " + httpObject2.hashCode());
        Log.d("TAG", "onCreate: " + databaseObject.hashCode());
        Log.d("TAG", "onCreate: " + presenter.hashCode());
        Button btn = findViewById(R.id.btn);
        btn.setOnClickListener((view)->{
            startActivity(new Intent(this, SecActivity.class));
        });
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值