Dagger2——项目中的使用场景(二)

系列文章目录

Dagger2的入门学习


一、Module在项目中的使用

基于上一篇的学习Dagger2的入门学习,我们对Dagger2的注入有了一定的认识,不过这还是不够让我们的项目变得简洁,接下来,请跟着我更加深入去学习Dagger2是如何管理第三方框架Retrofit,OkHttp的依赖实例

二、使用步骤

1.使用module提供对象实例

步骤1:定义网络请求接口

/**
 * Retrofit网络请求接口
 */
public interface ApiService {

    @GET("/user/info")
    Call<String> requestInfo();
}

步骤2:定义Module类,把所需的 第三方框架和网络请求实例 创建出来

//Module注解主要是为了将该类变成Dagger2框架中的模块,解决第三方框架提供实例的问题
@Module
public class NetModule {

    //第二种方式注入:告知Dagger2可以提供该Provides注解获取到注入对象的实例
    @Provides
    public Retrofit providesRetrofit(OkHttpClient okHttpClient){
        return new Retrofit.Builder()
                .client(okHttpClient)
                .baseUrl("http://baidu.com")
                .build();
    }

    //Dagger框架的意义:当模块中出现有其他类的实例时,则不需要重复去创建,只需要将其作为参数传入,就可以直接使用该实例对象
    @Provides
    public ApiService providesApiService(Retrofit retrofit){
        return retrofit.create(ApiService.class);
    }

    @Provides
    public OkHttpClient providesOkHttpClient(){
        return new OkHttpClient.Builder()
                .build();
    }
}

步骤3:在指定的Component接口中,连接依赖提供者(Modules)和依赖需求方(activity/application)

//@Component用于标记一个接口作为组件接口。组件接口是Dagger2用来连接依赖提供者(Modules)和依赖需求方(需要注入的对象)的桥梁。
//步骤2:在Component接口组件中,加入modules = NetModule.class,连接依赖提供者(Modules)和依赖需求方(需要注入的对象MainActivity)
@Component(modules = NetModule.class)
public interface ApplicationComponent {
    //步骤2:创建一个接口,并使用Component,然后创建一个方法把 依赖需求方(MainActivity) 和 依赖提供方(这里指的是User,还没用到Modules) 连接起来
    void inject(MainActivity mainActivity);
}

步骤4:在指定的地方调用

public class MainActivity extends AppCompatActivity {

    private static final String TAG="MainActivity";

    //步骤3:在依赖需求方使用同样的注解Inject
    @Inject
    User user;

    @Inject
    Retrofit retrofit;

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

        //步骤4:依赖注入(这一步之前,ReBuild一下)
        DaggerApplicationComponent.create().inject(this);
        Log.d(TAG, "User的实例对象: "+user);
        Log.d(TAG, "Retrofit的实例对象: "+retrofit);
    }
}

2.使用作用域实现单例

引言:因为第三方框架的实例创建资源占用大,不可以重复创建,故需要单例模式
步骤1:在需要的实例方法上面添加Singleton注解

//单例模式:只需要在上面添加作用域:Singleton
@Singleton
@Provides
public Retrofit providesRetrofit(OkHttpClient okHttpClient){
    return new Retrofit.Builder()
            .client(okHttpClient)
            .baseUrl("http://baidu.com")
            .build();
}

Singleton
步骤2:在其组件接口加上Singleton注解
在这里插入图片描述
步骤3:在对应的activity界面进行测试(属于局部单例)
在这里插入图片描述

测试结果:
在这里插入图片描述

3.在Application里面实现单例

引言:以上的这种单例模式是属于局部单例,仅在单一activity或者单一fragment界面下才能保持一致,如果要想在整个应用中都能保持一致,可以使用以下方式创建:
步骤1:在Application类就开始依赖注入

public class MyApplication extends Application {
    //步骤1:在Application类就开始依赖注入
   static ApplicationComponent applicationComponent= DaggerApplicationComponent.create();

   public static ApplicationComponent getApplicationComponent(){
       return applicationComponent;
   }
}

步骤2:在所需的activty界面替代依赖注入
在这里插入图片描述

2.读入数据

代码如下(示例):

data = pd.read_csv(
    'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())

该处使用的url网络请求的数据。


三、自定义作用域

导语:像前面使用的Singleton注解,如果在Module类使用了该注解,则也需要在对应的Component组件接口中使用该注解,不然会报错,二者要保持一致,也可以自己定义作用域,定义方式如下:
在这里插入图片描述
步骤1:定义接口,借用以上三个注解
在这里插入图片描述
步骤2:在所需的组件接口中引用
在这里插入图片描述
步骤3:在组件接口引入的模块类中也要引用
在这里插入图片描述
补充:如果不是在module类下的方法,同时也需要单个实例,则直接在该类上使用自定义的注解
在这里插入图片描述
测试结果:
在这里插入图片描述

  • 23
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值