系列文章目录
一、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();
}
步骤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
类下的方法,同时也需要单个实例,则直接在该类上使用自定义的注解
测试结果: