美文网首页Android developer
Dagger2最新版(2.11)在Android中的使用

Dagger2最新版(2.11)在Android中的使用

作者: 岛在深海处 | 来源:发表于2017-06-15 20:45 被阅读1026次

    由于网上关于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版本一致。

    相关文章

      网友评论

      • 浮华染流年:博主 可以放个Dagger2 +mvp封装的Demo 么 准备新项目用新的东西 ....
      • ZhangKuixun:我这样创建了但是失败,无法创建多个Fragment,一个acitivity智能绑定一个
      • 茗枫:其他activity fragment 的Component怎么写
        :smile:

      本文标题:Dagger2最新版(2.11)在Android中的使用

      本文链接:https://www.haomeiwen.com/subject/tdduqxtx.html