[译] 全新 Android 注入器 _ Dagger 2(三)(1)

全新 Android 注入器 : Dagger 2(三)

如果你还没有阅读(一)和(二),我建议你先阅读它们。

概要

你可以使用 DaggerActivityDaggerFragmentDaggerApplication 来减少 Activity/Fragment/Application 类里面的模板代码。

同样的,在 daggercomponent 中,你也可以通过 AndroidInjector<T> 去减少模板代码。

DaggerAppCompatActivity and DaggerFragment

在使用 daggerfragment 或者 activity 中要记得调用 AndroidInjection.inject() 方法。 同样的,如果你想要在 v4 包里面的 fragment 中使用 Injection,你应该让你的 activity 实现 HasSupportFragmentInject 接口并且重写 fragmentInjector 方法。

最近,我把这些相关代码移到 BaseActivityBaseFragment。因为与其在每个 activity 中声明这些,还不如把共同的代码放到基类里面。

于是我在研究 dagger 项目的时候发现 DaggerAppCompatActivityDaggerFragment 这些类正好是我所需要的。如果说 Android 喜欢继承,那么我们也可以假装喜欢继承 😛

让我们看看这些类做了些神马。

@Beta
public abstract class DaggerAppCompatActivity extends AppCompatActivity
implements HasFragmentInjector, HasSupportFragmentInjector {

@Inject DispatchingAndroidInjector supportFragmentInjector;
@Inject DispatchingAndroidInjector<android.app.Fragment> frameworkFragmentInjector;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
AndroidInjection.inject(this);
super.onCreate(savedInstanceState);
}

@Override
public AndroidInjector supportFragmentInjector() {
return supportFragmentInjector;
}

@Override
public AndroidInjector<android.app.Fragment> fragmentInjector() {
return frameworkFragmentInjector;
}
}

从上面的代码可以看出 DaggerAppCompatActivity 跟我们自己写的 Activity 并没有多大的区别,所以可以让我们的 Activity 以继承 DaggerAppCompatActivity 的方式来减少模板代码。

DetailActivity 类如下:

public class DetailActivity extends AppCompatActivity implements HasSupportFragmentInjector, DetailView {

@Inject
DispatchingAndroidInjector fragmentDispatchingAndroidInjector;

@Inject
DetailPresenter detailPresenter;

@Override
protected void onCreate(Bundle savedInstanceState) {
AndroidInjection.inject(this);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail);
}

@Override
public void onDetailLoaded() {}

@Override
public AndroidInjector supportFragmentInjector() {
return fragmentDispatchingAndroidInjector;
}
}

让我们的 DetailActivity 继承 DaggerAppCompatActivity 类,这样我们就不用让 DetailActivity 类实现 HasSupportFragmentInjector 接口以及重写方法了。

public class DetailActivity extends DaggerAppCompatActivity implements DetailView {

@Inject
DetailPresenter detailPresenter;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail);
}

@Override
public void onDetailLoaded() {}
}

现在,是不是更简洁了。

DaggerApplication, AndroidInjector, AndroidSupportInjectionModule

看看还有哪些办法能够减少模板代码。我发现 AndroidInjector 能够帮助简化 AppComponent。你可以通过阅读 AndroidInjector 相关文档来获取相关信息。

下面是 AppComponent 类的代码。

@Component(modules = {
AndroidInjectionModule.class,
AppModule.class,
ActivityBuilder.class})
public interface AppComponent {

@Component.Builder
interface Builder {
@BindsInstance Builder application(Application application);
AppComponent build();
}

void inject(AndroidSampleApp app);
}

build()seedInstance() 方法已经在 AndroidInjector.Builder 抽象类中定义了,所以我们的 Builder 类可以通过继承 AndroidInjection.Builder<Application> 来去掉上面代码中 application()build() 这两个方法。

同样的,AndroidInjector 接口中已经有 inject() 方法了。所以我们可以通过继承 AndroidInjector<Application> 接口(接口是可以继承接口的)来删除 inject() 方法。

那么我们简化后的 AppComponent 接口的代码如下:

@Component(modules = {

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助

因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
*

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 21
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值