dagger android 学习(二):AndroidInjector的使用
本系列博客主要用于自己學習積累,順便幫助新手入門,如有問題,多多包涵。更詳細的一些使用可以看看其他更加詳細的博客。
dagger android 學習(一):dagger基礎使用
dagger android 學習(二):AndroidInjector的使用
dagger android 學習(三):ContributesAndroidInjector的進一步優化
dagger android 學習(四):基于dagger2的mvp架構
在安卓實際開發中,我們需要用到許多的activity以及fragment,這樣我們在進行依賴注入的之后都要進行一些重復的操作,比如在comonent中加入void inject(XXXActivity activity),以及在Activity中加入DaggerMyAppComponent.builder().build().inject(this),好在dagger2也提供了解決方法,讓我們不需要每次去寫inject方法。
添加依賴
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
創建一個接口繼承AndroidInjector
@Subcomponent(modules = {AndroidInjectionModule.class, }) public interface MainActivitySubcomponent extends AndroidInjector<MainActivity> {@Subcomponent.Builderabstract class Builder extends AndroidInjector.Builder<MainActivity> {} } 復制代碼ActivityModule
實現用于綁定activity的Module
@Module(subcomponents = MainActivitySubcomponent.class) public abstract class MainActivityModule {@Binds@IntoMap@ClassKey(MainActivity.class)abstract AndroidInjector.Factory<?> bindMainActivityInjectorFactory(MainActivitySubcomponent.Builder builder); } 復制代碼AppComponent
@Component(modules = {AndroidInjectionModule.class,AndroidSupportInjectionModule.class,MainActivityModule.class,Main2ActivityModule.class, }) public interface MyAppComponent {void inject(MyApplication application);@Component.Builderinterface Builder{MyAppComponent build();} } 復制代碼Application
application繼承HasActivityInjector,實現inject方法,返回DispatchingAndroidInjector對象即可
public class MyApplication extends Application implements HasActivityInjector {@InjectDispatchingAndroidInjector<Activity> dispatchingAndroidInjector;@Overridepublic void onCreate() {super.onCreate();DaggerMyAppComponent.builder().build().inject(this);}@Overridepublic AndroidInjector<Activity> activityInjector() {return dispatchingAndroidInjector;} } 復制代碼BaseActivity
baseActivity在super.onCreate之前調用AndroidInjection.inject(this),這樣之后的activity就只需要繼承它,直接可以使用了,不需要再單獨加入inject方法
open class BaseActivity: AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {AndroidInjection.inject(this)super.onCreate(savedInstanceState)} } 復制代碼使用
使用的時候直接@inject就行,無需任何處理
public class MainActivity extends BaseActivity {@InjectA2 a2;@InjectC c;@InjectUserInfo userInfo;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);findViewById(R.id.tv).setOnClickListener(new View.OnClickListener() {@Overridepublic 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模塊
轉載于:https://juejin.im/post/5cc7202fe51d456e31164a6c
總結
以上是生活随笔為你收集整理的dagger android 学习(二):AndroidInjector的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三星F34 5G新机再曝光 现身谷歌Pl
- 下一篇: 互联网安全问题的起因