热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

初谈一Dagger2

离职的心绪,就如同立春这几天的天气,多了一点急躁,少了一份安宁…上一个项目当时采用了MVP搭建框架,MVP结合Dagger2,进一步解耦P层和M层模块。有关MVP的文章实在是太多了

离职的心绪,就如同立春这几天的天气,多了一点急躁,少了一份安宁…

上一个项目当时采用了 MVP 搭建框架,MVP 结合 Dagger2 ,进一步解耦 P 层和 M 层模块。有关 MVP 的文章实在是太多了,如果你还不是很了解,还请科普下。Dagger2 是一个Android依赖注入框架,由谷歌开发,最早的版本Dagger1Square公司开发。依赖注入框架主要用于模块间解耦,提高代码的健壮性和可维护性。

本篇主要讲解 Dagger2 的使用。

依赖Dagger2

分为两步。

步骤一:

项目根目录build.gradle文件中添加apt插件:

dependencies {
classpath 'com.android.tools.build:gradle:2.2.3'
//引入apt插件
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}

步骤二:

app->build.gradle文件添加如下代码:

apply plugin: 'com.android.application'
//添加如下代码,应用apt插件
apply plugin: 'com.neenbedankt.android-apt'
dependencies {
//添加依赖库
compile 'com.google.dagger:dagger:2.4'
apt 'com.google.dagger:dagger-compiler:2.4'
}

使用Dagger2

这里我将以登录模块来讲解Dagger2的使用。我们在使用MVP模式中
Activity持有presenter的引用,同时presenter也持有view的引用,如果presenter的构造函数改变,我们需要同时修改Activitypresenter代码,Activity就和presenter仅仅的耦合在一起了。那么我们怎样才能降低它们之间的耦合,以便后期的维护。感谢党为我们提供了Dagger2依赖注入框架,那我们一起来看一看它在项目中是怎么使用的呢?

最终实现的效果图:

《初谈一Dagger2》 dag

再来看看目录结构:

《初谈一Dagger2》 dag

咳咳,大哥有你这么复杂吗?我经常一个Activity就搞定了,还用你这么多类,花费多少时间啊?

如果你独立开发与维护这个项目还好点,如果是其他人来维护这个项目,可能就是一场灾难。若Activity过于庞大臃肿,可能你都不知道从何下手?

优缺点就非常明显了,优点:易扩展易维护;缺点:代码量。

下面先来看看LoginActivity 的代码,文章结尾会附上源代码,本文贴代码的地方比较多,还请下载Demo跑起来结合理解:

public class LoginActivity extends AppCompatActivity implements ILoginView {
//注入
@Inject
LoginPresenter mLoginPresenter;
EditText mEtUsername, mEtPassword;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mEtUsername = (EditText) findViewById(R.id.et_username);
mEtPassword = (EditText) findViewById(R.id.et_password);

DaggerLoginComponent.builder().loginModule(new LoginModule(this)).build().inject(this);
}
@Override
public void emptyData() {
Toast.makeText(this, getString(R.string.empty_data), Toast.LENGTH_SHORT).show();
}
@Override
public void loginFailed() {
Toast.makeText(this, getString(R.string.login_failed), Toast.LENGTH_SHORT).show();
}
@Override
public void loginSuccess() {
Toast.makeText(this, getString(R.string.login_success), Toast.LENGTH_SHORT).show();
}
public void login(View view) {
mLoginPresenter.login(mEtUsername.getText().toString(), mEtPassword.getText().toString());
}
}

在上述代码中可以看到LoginActivity持有了LoginPresenter的引用,并使用了@Inject注解创建了该对象。注入的代码如下:

//注入
@Inject
LoginPresenter mLoginPresenter;

接下来看看LoginPresenter类:

public class LoginPresenter {
LoginBiz mLoginBiz;
ILoginView mILoginView;
//此处使用了注解
@Inject
public LoginPresenter(ILoginView ILoginView) {
mILoginView = ILoginView;
mLoginBiz = LoginBiz.getInstance();
}
public void login(String username, String password) {
if (username.equals("") || password.equals("")) {
mILoginView.emptyData();
} else {
mLoginBiz.login(username, password, new ILoginBiz() {
@Override
public void loginSuccess() {
//如果是网络请求,请注意切换到主线程
mILoginView.loginSuccess();
}
@Override
public void loginFailed() {
mILoginView.loginFailed();
}
});
}
}
}

@Inject 标记 LoginPresenter 构造函数。 使用@Inject还无法完成依赖注入,还需要如下两个新增类。

新增LoginModule类:

//此处使用了注解
@Module
public class LoginModule {
private final ILoginView mILoginView;
public LoginModule(ILoginView ILoginView) {
mILoginView = ILoginView;
}
//此处使用了注解
@Provides
ILoginView provideLoginView() {
return mILoginView;
}
}

新增的LoginComponent类:

//此处使用了注解
@Component(modules = LoginModule.class)
public interface LoginComponent {
public void inject(LoginActivity activity);
}

记得 rebuildLoginActivity中通过:

DaggerLoginComponent.builder().loginModule(new LoginModule(this)).build().inject(this);

完成依赖注入。

你一定会有疑问,这里的@Inject@Module@Component 到底有什么用途。

  • @Inject 程序会将Dagger2会将带有此注解的变量或者构造方法参与到依赖注入当中,Dagger2会实例化这个对象。

  • @Module 带有该注解的类需要对外提供依赖,其实就是提供实例化需要的参数,Dagger2在实例化的过程中发现一些参数,Dagger2就会到该类中寻找带有@Provides注解的以provide开头的需找对应的参数。

  • @Component 带有该注解的接口或抽象类起到一个关联桥梁的作用,作用就是将带有@Inject的方法或对象和带有@Module的类进行关联,只有通过该接口或抽象类才可以在实例化的时候到带有 @Module中类中去寻找需要的参数,也就是依赖注入。

有关Dagger2的简单使用就讲到这里。

源码链接

我非常喜欢【平凡世界】里的一句话,送给大家。

我是一个平凡的人,但一个平凡的人,也可以过得不平凡。


推荐阅读
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 带添加按钮的GridView,item的删除事件
    先上图片效果;gridView无数据时显示添加按钮,有数据时,第一格显示添加按钮,后面显示数据:布局文件:addr_manage.xml<?xmlve ... [详细]
  • 开发笔记:Dagger2 探索记3——两大进阶组件
        今天要讲的时@Scope这个组件。为什么说它是进阶组件,就是因为它基本上没作用,但在理解了基本组件之后又必须用到。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 深入理解CSS中的margin属性及其应用场景
    本文主要介绍了CSS中的margin属性及其应用场景,包括垂直外边距合并、padding的使用时机、行内替换元素与费替换元素的区别、margin的基线、盒子的物理大小、显示大小、逻辑大小等知识点。通过深入理解这些概念,读者可以更好地掌握margin的用法和原理。同时,文中提供了一些相关的文档和规范供读者参考。 ... [详细]
  • 本文介绍了一款名为TimeSelector的Android日期时间选择器,采用了Material Design风格,可以在Android Studio中通过gradle添加依赖来使用,也可以在Eclipse中下载源码使用。文章详细介绍了TimeSelector的构造方法和参数说明,以及如何使用回调函数来处理选取时间后的操作。同时还提供了示例代码和可选的起始时间和结束时间设置。 ... [详细]
  • 今天就跟大家聊聊有关怎么在Android应用中实现一个换肤功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根 ... [详细]
  • SmartRefreshLayout自定义头部刷新和底部加载
    1.添加依赖implementation‘com.scwang.smartrefresh:SmartRefreshLayout:1.0.3’implementation‘com.s ... [详细]
  • 详解Android  自定义UI模板设计_由浅入深
    学习安卓已有一些日子,前段时间整理了不少笔记,但是发现笔记不变分享与携带。今天开始整理博客,全当是与大家分享交流与自身学习理解的过程吧。结合最近在做的一个新闻类app及学习中的问题,一点一点整理一下, ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了10分钟了解Android的事件分发相关的知识,希望对你有一定的参考价值。什么是事件分发?大家 ... [详细]
  • 1.在gradle中添加依赖在主项目的build.gradle中添加Dagger2库的依赖dependencies{compilecom.google.dagger:dagger: ... [详细]
  • Android Studio中使用apt
    AndroidStudio中使用apt一、前言你还在对着枯燥的重复代码一味复制粘贴吗?这样跟搬砖有何区别?你是否曾想过:你用代码编写出一个自动化的APP,但为何代码本身却缺少了活力 ... [详细]
author-avatar
大小姐_T_841
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有