Dagger2 再菜鸟入门

2023-11-23 11:38
文章标签 入门 菜鸟 dagger2

本文主要是介绍Dagger2 再菜鸟入门,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        想放两个链接,是我最初对dagger2的理解,也许对你有帮助:

         一些关于dagger2的理解(一)      一些关于dagger2的理解(二)   

         刚刚开始接触Dagger2的时候,肯定是一脸蒙圈,尤其是对于那些不熟悉注解的程序员来说,更是感觉像天书一般“迷人”。
         Dagger2最初给人的印象是很华丽的:尤其是在初级的示例中,一组provide 、Module、Component提供的仅仅是一个无参实体类的初始化,好大一头奶牛只挤出一滴优酸乳。
         我个人理解它是这样的:
         本质:注解框架;
         目的:全新的实例初始化方式(体系);
         优势:统一配置,方便复用(但要注意单例等);
         劣势:小项目不是很实用
 
先说优势:
         假如你买矿泉水,现在的国家标准是满足一条标准的就允许出售(具体最多几条,谁知道),矿泉水是这样的:

public class KuangquanWater {private String norm;public KuangquanWater(String norm) {this.norm = norm;}public String show(){return norm;}
}

        普通情况下是这样的:

public class Consume {KuangquanWater m = new KuangquanWater("透明度");
}
        Dagger2是这样的:
@Module
public class WaterModule{public KuangquanWater getWaterOne(){return new KuangquanWater("透明度");}
}
@Component(modules = WaterModule.class)
public interface WaterComponent{void inject(Consume c);
}public class Consume {@InjectKuangquanWater m; void onCreate(){DaggerWaterComponent.builder().build().inject(this);}}

         握了颗草,一个初始化搞了这么多幺蛾子,要折寿啊!
         如果有一百个人要买这种水,需要一百个Component去包装水。那么这个时候问题来了:如果我标准变了,要求水质必须有两个标准符合,成了这样:

public class KuangquanWater {private String norm1;private String norm2;public KuangquanWater(String norm1,String norm2) {this.norm1 = norm1;this.norm2 = norm2;}public String show(){return norm1+"+"+norm2;}
}

         按照普通情况,如果有100个实例化,我要改100个实例化的地方,想想就  法克(汉语发音) 了!
         而dagger只需要这样:

@Module
public class WaterModule{public KuangquanWater getWaterOne(){return new KuangquanWater("透明度","矿物质含量");}
}

         只修改一个地方,1000个都可以不用管了。
         就问你怕不怕!当然实际应用数量不可能这么夸张,但是构造方法的复杂度会增加,也不是这里这么简单了。意义依旧重大的不要不要的。




Dagger2的注解:
 
         @Provide(用于注解方法) 标注某个返回类型的get方法,声明该类型可用并在后面会被用到;
         @Module(用于注解类) 用来包含@Provide提供的类型,起到一个包装的作用;
         @Component(用于注解类) 把@Module的包装集合起来,供某个类使用;
         @Inject(用于注解变量) 在集合中所有包含的@Provide进来的找相同类型;
 
         我还是喜欢打个粗俗的比喻,饿了想吃包子,点个外卖吧:想吃什么馅(@Inject)自己是知道的。而包子店里的馅(@Provider)是要放进包子(@Module)的,包子是怎么到手里的?快递(Build得到的DaggerXXComponent)把各种包子的包裹(@Component)送过来的。如果你想吃好几种口味好几种馅(多个@Inject),可能就需要买多个包子(@Component=(modules={aModule.class,bModule.class…}))了;
        
         来,咱么走一趟,边写边说。
         打算做这么个小项目:计算两个人的缘分值。
         要用到的算法就是:两个名字的hashCode按比例相加,然后模100,就是圆粪值。
1.      先新建个项目,名字随便起
2.      Project的build.gradle添加如下:



        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'

3.      在module的build.gradle添加如下两处:



apply plugin: 'com.neenbedankt.android-apt'compile 'com.google.dagger:dagger:2.5'
apt 'com.google.dagger:dagger-compiler:2.5'
provided 'org.glassfish:javax.annotation:10.0-b28'

4.      准备三个实体类:

public class People {private int ratio;//计算比例public People(int ratio) {this.ratio = ratio;}public int getScore(String name){return name.hashCode()*ratio/10;}
}public class Man extends People{public Man(int rote) {super(rote);}public Man(){this(6);}
}public class Woman extends People {public Woman(int rote) {super(rote);}public Woman(){this(4);}
}

         接下来是重点了


5.      做馅,包包子(@Provide和@Module)

/*** Created by ShuaiZhang on 2016/9/29.*/
@Module
public class PeopleModule {@ProvidesWoman getWoman(){return new Woman(8);//自由指定}@ProvidesMan getMan(){return new Man(8);//自由指定}@Provides @Named("nv")// 存在同样的两个People,就需要@Named来区分People getNv(){return new Woman();}@Provides @Named("nan")People getNan(){return new Man();}
}

 
         其实分开两个来比较好,但是我懒……
6.      打包上面的包子

@Component(modules = PeopleModule.class)//没错,我就是打包
public interface PeopleComponent {void inject(MainActivity m);//指定客户
}

         菜单栏BuildàRebuild Project一下。
7.      干掉到手的包子
         先上布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/activity_main"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context="com.shazeys.yinyuan.MainActivity"><TextViewandroid:layout_marginTop="15dp"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="男名:" /><EditTextandroid:id="@+id/edt_man"android:layout_width="match_parent"android:layout_height="wrap_content" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="女名:" /><EditTextandroid:id="@+id/edt_woman"android:layout_width="match_parent"android:layout_height="wrap_content" /><TextViewandroid:id="@+id/txt_score"android:layout_marginTop="20dp"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="得分:无" /><Buttonandroid:id="@+id/btn_compute"android:text="计算"android:layout_width="match_parent"android:layout_height="wrap_content" />
</LinearLayout>

         MainActivity.class:

public class MainActivity extends AppCompatActivity {@InjectWoman woman;@InjectMan man;EditText edtNan;EditText edtNv;TextView txtScore;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);DaggerPeopleComponent.builder()//接收到外卖了.build().inject(this);edtNan = (EditText) findViewById(R.id.edt_man);edtNv = (EditText) findViewById(R.id.edt_woman);txtScore = (TextView) findViewById(R.id.txt_score);Button btnCompute = (Button) findViewById(R.id.btn_compute);btnCompute.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {if (checkInput())compute();}});}/*** 计算得分并显示*/private void compute() {int nan = man.getScore(edtNan.getText().toString());int nv = woman.getScore(edtNv.getText().toString());int result = (nan+nv)%100;txtScore.setText("得分:"+result);}/*** 判断输入值* @return*/boolean checkInput(){if (edtNan.getText().toString().equals("")){showToast("请输入男名");return false;}if (edtNv.getText().toString().equals("")){showToast("请输入女名");return false;}return true;}void showToast(String tip){Toast.makeText(this,tip,Toast.LENGTH_SHORT).show();}
}

 

         到这里就可以运行看效果了。

         不过,最好还是把包子里刚刚留的坑也处理一下,修改MainActivity.class的代码(只显示修改部分,其他均不变):


         用@Named来区分相同的@Provide。

 

        赶时髦,代码放到了我的Github上:地址链接

         最后声明:本计算不含任何科学或者迷信依据,请勿相信,请勿较真。









这篇关于Dagger2 再菜鸟入门的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/417667

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题:

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

poj 2104 and hdu 2665 划分树模板入门题

题意: 给一个数组n(1e5)个数,给一个范围(fr, to, k),求这个范围中第k大的数。 解析: 划分树入门。 bing神的模板。 坑爹的地方是把-l 看成了-1........ 一直re。 代码: poj 2104: #include <iostream>#include <cstdio>#include <cstdlib>#include <al

MySQL-CRUD入门1

文章目录 认识配置文件client节点mysql节点mysqld节点 数据的添加(Create)添加一行数据添加多行数据两种添加数据的效率对比 数据的查询(Retrieve)全列查询指定列查询查询中带有表达式关于字面量关于as重命名 临时表引入distinct去重order by 排序关于NULL 认识配置文件 在我们的MySQL服务安装好了之后, 会有一个配置文件, 也就

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

C语言指针入门 《C语言非常道》

C语言指针入门 《C语言非常道》 作为一个程序员,我接触 C 语言有十年了。有的朋友让我推荐 C 语言的参考书,我不敢乱推荐,尤其是国内作者写的书,往往七拼八凑,漏洞百出。 但是,李忠老师的《C语言非常道》值得一读。对了,李老师有个官网,网址是: 李忠老师官网 最棒的是,有配套的教学视频,可以试看。 试看点这里 接下来言归正传,讲解指针。以下内容很多都参考了李忠老师的《C语言非

MySQL入门到精通

一、创建数据库 CREATE DATABASE 数据库名称; 如果数据库存在,则会提示报错。 二、选择数据库 USE 数据库名称; 三、创建数据表 CREATE TABLE 数据表名称; 四、MySQL数据类型 MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串类型 4.1 数值类型 数值类型 类型大小用途INT4Bytes整数值FLOAT4By

【QT】基础入门学习

文章目录 浅析Qt应用程序的主函数使用qDebug()函数常用快捷键Qt 编码风格信号槽连接模型实现方案 信号和槽的工作机制Qt对象树机制 浅析Qt应用程序的主函数 #include "mywindow.h"#include <QApplication>// 程序的入口int main(int argc, char *argv[]){// argc是命令行参数个数,argv是