本系列博客主要用於本身學習積累,順便幫助新手入門,若有問題,多多包涵。更詳細的一些使用能夠看看其餘更加詳細的博客。android
dagger android 學習(一):dagger基礎使用
dagger android 學習(二):AndroidInjector的使用
dagger android 學習(三):ContributesAndroidInjector的進一步優化
dagger android 學習(四):基於dagger2的mvp架構git
在安卓實際開發中,咱們須要用到許多的activity以及fragment,這樣咱們在進行依賴注入的以後都要進行一些重複的操做,好比在comonent中加入void inject(XXXActivity activity),以及在Activity中加入DaggerMyAppComponent.builder().build().inject(this),好在dagger2也提供瞭解決方法,讓咱們不須要每次去寫inject方法。github
implementation 'com.google.dagger:dagger:2.21'
annotationProcessor 'com.google.dagger:dagger-compiler:2.21'
implementation 'com.google.dagger:dagger-android:2.21'
implementation 'com.google.dagger:dagger-android-support:2.21'
annotationProcessor 'com.google.dagger:dagger-android-processor:2.21'
複製代碼
建立一個接口繼承AndroidInjector架構
@Subcomponent(modules = {
AndroidInjectionModule.class,
})
public interface MainActivitySubcomponent extends AndroidInjector<MainActivity> {
@Subcomponent.Builder
abstract class Builder extends AndroidInjector.Builder<MainActivity> {
}
}
複製代碼
實現用於綁定activity的Moduleapp
@Module(subcomponents = MainActivitySubcomponent.class)
public abstract class MainActivityModule {
@Binds
@IntoMap
@ClassKey(MainActivity.class)
abstract AndroidInjector.Factory<?> bindMainActivityInjectorFactory(MainActivitySubcomponent.Builder builder);
}
複製代碼
@Component(modules = {
AndroidInjectionModule.class,
AndroidSupportInjectionModule.class,
MainActivityModule.class,
Main2ActivityModule.class,
})
public interface MyAppComponent {
void inject(MyApplication application);
@Component.Builder
interface Builder{
MyAppComponent build();
}
}
複製代碼
application繼承HasActivityInjector,實現inject方法,返回DispatchingAndroidInjector對象便可ide
public class MyApplication extends Application implements HasActivityInjector {
@Inject
DispatchingAndroidInjector<Activity> dispatchingAndroidInjector;
@Override
public void onCreate() {
super.onCreate();
DaggerMyAppComponent.builder().build().inject(this);
}
@Override
public AndroidInjector<Activity> activityInjector() {
return dispatchingAndroidInjector;
}
}
複製代碼
baseActivity在super.onCreate以前調用AndroidInjection.inject(this),這樣以後的activity就只須要繼承它,直接可使用了,不須要再單獨加入inject方法post
open class BaseActivity: AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
AndroidInjection.inject(this)
super.onCreate(savedInstanceState)
}
}
複製代碼
使用的時候直接@inject就行,無需任何處理學習
public class MainActivity extends BaseActivity {
@Inject
A2 a2;
@Inject
C c;
@Inject
UserInfo userInfo;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.tv).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this, Main2Activity.class));
}
});
a2.someThingA();
c.doSomethingC();
userInfo.setAge("111");
Log.e("DAGGER", userInfo.toString());
}
}
複製代碼
dagger-android-support解決了每次新建Activity都須要在Activity中添加格子的inject方法,全部的inject都在BaseActivity中,這讓代碼簡潔了不少。可是即便如此,仍是有較多一部分的模板代碼,如例子中的ActivityModule和ActivitySubcomponent。每次新建一個Activity都須要建立這兩個類,這樣看起來仍是很麻煩,好在dagger2還提供了@ContributesAndroidInjector註解解決了這個問題。
demo地址:查看項目中的app模塊優化