由于网上关于2.11版本的学习资料还不太全,所以我只是把使用流程记录下来,毕竟在这上面也花了一些时间。
1.添加依赖
关于添加Android支持包依赖可以看上一篇文章Dagger2疑虑的第二点。
2.MyApplication实现HasActivityInjector
public class MyApplication extends Application implements HasActivityInjector {
@Inject
DispatchingAndroidInjector<Activity> dispatchingAndroidInjector;
@Override
public void onCreate() {
super.onCreate();
}
@Override
public DispatchingAndroidInjector<Activity> activityInjector() {
return dispatchingAndroidInjector;
}
}
Activity实现HasSupportFragmentInjector
public class MainActivity extends AppCompatActivity implements HasSupportFragmentInjector{
@Inject
DispatchingAndroidInjector<Fragment> dispatchingAndroidInjector;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public AndroidInjector<Fragment> supportFragmentInjector() {
return dispatchingAndroidInjector;
}
}
3.创建Module
例如:先创建个 HttpModule
@Module
public class HttpModule {
@Singleton
@Provides
Retrofit.Builder provideRetrofitBuilder() {
return new Retrofit.Builder();
}
@Singleton
@Provides
OkHttpClient.Builder provideOkHttpBuilder() {
return new OkHttpClient.Builder();
}
@Singleton
@Provides
Retrofit provideRequestRetrofit(Retrofit.Builder builder, OkHttpClient client) {
return createRetrofit(builder, client, RequestApis.HOST);
}
private Retrofit createRetrofit(Retrofit.Builder builder, OkHttpClient client, String url) {
return builder
.baseUrl(url)
.client(client)
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();
}
}
如果还有其他Module也可以创建出来,最后一定要创建一个AppModule,如下例子:
@Module(includes = HttpModule.class)//创建的Module都可以写在这里被AppModule包括,也可以写在AppComponent中的modules={...}里面与AppMoudle同级
public class AppModule {
@Provides
@Singleton
RetrofitHelper provideRetrofitHelper(RequestApis requestApis) {
return new RetrofitHelper(requestApis);
}
@Provides
@Singleton
RealmHelper provideRealmHelper(Application application) {//主意这里使用了Application这个依赖,所以需要我们提供,目前我只知道在AppComponent中编写Builder接口注入
return new RealmHelper(application);
}
}
然后创建一个“统一管理依赖于AppComponent的Module添加的中间件”,我们先从Activity开始
@Module
public abstract class ActivityModule { //主意为抽象类
@ContributesAndroidInjector(modules = MainActivityFragmentModule.class)//主意这个地方,只要这个Activity有Fragment就需要注明它的FragmentModule
abstract MainActivity contributeMainActivity();
@ContributesAndroidInjector
abstract RegisterActivity contributeRegisterActivity();
@ContributesAndroidInjector
abstract LoginActivity contributeLoginActivity();
}
MainActivityFragmentModule的代码如下:
@Module
public abstract class MainActivityFragmentModule { //说明MainActivity中包含了如下4个Fragment
@ContributesAndroidInjector
abstract FeaturedFragment contributeFeaturedFragment();
@ContributesAndroidInjector
abstract MyProfileFragment contributeMyProfileFragment();
@ContributesAndroidInjector
abstract DownloadRankFragment contributeDownloadRankFragment();
@ContributesAndroidInjector
abstract UpdatesFragment contributeUpdatesFragment();
}
最后我们的AppComponent的代码如下:
@Singleton
@Component(modules = {
AndroidSupportInjectionModule.class, //这个需不需要写我占时没测
AppModule.class,
ActivityModule.class,
})
public interface AppComponent {
//为了提供Application依赖
@Component.Builder
interface Builder {
@BindsInstance
Builder application(Application application);
AppComponent build();
}
void inject(App app);
}
这些步骤完成之后,需要在Application,Activity,Fragment中配置。
1.Application配置如下 在onCreate()方法中:
DaggerAppComponent.builder().application(this)
.build().inject(this);
2.Activity中的配置如下,在onCreate()方法中 super.onCreate(savedInstanceState)之前:
AndroidInjection.inject(this);
3.Fragment中配置如下,在onAttach()方法的super.onAttach(context)之前:
AndroidSupportInjection.inject(this);
然后就可以运行了,其他用法与2.04版本一致。