美文网首页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