前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >初学Dagger之Hello Dagger(0)

初学Dagger之Hello Dagger(0)

作者头像
冰之角
发布2018-09-04 15:58:10
4200
发布2018-09-04 15:58:10
举报
文章被收录于专栏:Winter漫聊技术

写作背景 这几天在学习Dagger、MVP、Agera,这里所说的Dagger即Google接手的Dagger,也被称作Dagger 2。跟着demo与一些技术博客学习,发现对于一个未曾使用过类似框架的人来说上手很困难,因此撰 初学Dagger 系列学习笔记,以一名初学者的视角来分享自己的学习经验,希望让大家上手更顺利。本文集将随Winter的学习进度更新。

Hello Dagger

环境配置 我比较喜欢从功能入手来了解一个框架,所以让我们从Hello Dagger开始吧。

用 Android Studio 新建一个项目,选择 Empty Activity

如上图,新建一个项目 Hello Dagger, 选择 Empty Activity 模版。项目创建好后,在build.gradle(Project: HelloDagger)文件中的dependencies内添加

代码语言:javascript
复制
 classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'

在build.gradle(Module: app)文件中最外层的上方添加

代码语言:javascript
复制
apply plugin: 'com.neenbedankt.android-apt'

继续在该文件内的dependencies内添加

代码语言:javascript
复制
// apt command comes from the android-apt plugin
apt 'com.google.dagger:dagger-compiler:2.2'
compile 'com.google.dagger:dagger:2.2'
provided 'javax.annotation:jsr250-api:1.0'

这样,Dagger的环境便配置好了,下面让我们来开心地实现Hello Dagger.

代码实现 官方的例子有点复杂,我表示看起来很吃力,所以,这里我们实现一个最简单的Dagger demo就好了: 点击按钮,获取Dagger注解的一个String,并显示Toast。 首先,在activity_main布局中添加一个按钮, 用于触发事件,如下:

代码语言:javascript
复制
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="Say hello"/>

然后创建建一个类文件 AppModule

代码语言:javascript
复制
@Module
public class AppModule {
@Provides
String provideHello() {
return "hello dagger";
}
@Provides
@Named("hi")
String provideHi() {
return "hi dagger";
}
}

@Module : 依赖的提供者,通俗的说就是该类负责提供数据内容; @Provides : 负责提供值,被注解的方法提供返回参数类型的数据,如果同一个module中多个provides返回参数类型一致,那么必须加@Named("xxx")以进行区分,其实xxx才是该provides的真正名字,方法名没有什么意义。 再来创建一个接口文件 AppComponent

代码语言:javascript
复制
@Component(modules = {AppModule.class})
public interface AppComponent {
void inject(MainActivity activity);
}

@Component :依赖的注入者,AppComponent在编译时会自动生成 DaggerAppComponent文件,因为modules = {AppModule.class},所以DaggerAppComponent可以访问AppModule.class内的内容,接口内有方法 void inject(MainActivity activity) ,所以该接口也可以访问MainActivity,因而可以成为MainActivity与AppModule.class之间的桥梁。 先编译一下,使AppComponent生成DaggerAppComponent文件,接着在MainActivity的onCreate()方法内添加以下代码

代码语言:javascript
复制
DaggerAppComponent.builder()
.appModule(new AppModule())
.build()
.inject(this);

这样一来,AppModule内的内容便注入到MainActivity中了,现在我们可以在MainActivity中访问AppModule里面的内容了,访问方式如下,在MainActivity中添加全局变量

代码语言:javascript
复制
@Inject
String hello;
@Inject
@Named("hi")
String hi;

@Inject :需要注入依赖的地方,Dagger 会构造一个该类的实例并满足它所需要的依赖,通俗地说就是该变量被初始化为AppModule中@Provides且同类型同名(@Named相同)的方法的返回值了。 感觉还是挺神奇,这里为了方便把注入写在MainActivity中了,如果在Application中注入,那么仅需初始化一次,该Application下的所有类都能访问了。 好了,为按钮添加点击事件,并showToast看看。 Demo地址如下: https://github.com/XunMengWinter/HelloDagger

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016.06.13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档