Android开发中依赖注入的应用

什么是依赖注入?

依赖是指一个对象持有其他对象的引用。依赖注入则是将这些依赖对象传递给被依赖对象,而不是被依赖对象自己创建这些对象。 
public class MyClass{private AnotherClass mAnotherObject;public MyClass(){mAnotherObject = new AnotherClass();}
}
通过传递对象的方式,所传递对象的更改不会影响代码。 
public class MyClass{private MyInterface mAnotherObject;public MyClass(MyInterface anotherObject){mAnotherObject = anotherObject;}
}

  依赖注入可以简化代码编写,并提供一个可适配的环境,方便进行单元测试以及功能模块的配置。 

开发中可能会遇到这样的麻烦。

我们将通过一个例子来理解依赖注入的应用场景:某Android应用需要一个列表来显示用户的好友。 
public class FriendListFragment{private FriendListAPI mFriendListAPI;......public FriendListFragment(){mFriendListAPI = new FriendListAPI();}private void getFriendList(){mFriendListAPI.getFriendList(new Callback(){public void onSuccess(List<User> list){......}......});}
}public class FriendListAPI{private OkHttpClient mHttpClient;public FriendListAPI(){mHttpClient= new OkHttpClient();//接下来各种Http配置
          ......}
}

  代码写好了,运行程序试试。可是,后台API没有准备好或者没有数据怎么办?自己添点测试数据试试吧。在FriendListFragment里面添加一个生成测试数据的方方法buildTestData(),并替换getFriendList()方法。等后台API准备好后再改回来。

我们想测试网络有延迟或错误的时候,程序是否会出现异常。这需要通过配置OkHttpClient参数来实现测试场景,于是又要更改FriendListAPI中相关HttpClient配置代码,测试完后再修改回来。
这样对代码进行多次修改,很容易出错。因此,对于多次使用的模块,我们可以通过注入的方式,将引用传入需要使用的类中,而不是自己创建。通过编写两个API,一个是直接请求后台数据,另一个则只是一些静态测试数据。需要测试的时候注入可生成测试数据的API,测试完后则切换为正式API。 
public class FriendListFragment{private FriendListAPI mFriendListAPI;......public FriendListFragment(FriendListAPI friendListAPI){mFriendListAPI = friendListAPI;}
}public class FriendListAPI{private OkHttpClient mHttpClient;public FriendListAPI(HttpClient okHttpClient){mHttpClient= okHttpClient;......}
}

  现在引入一个稍微复杂的场景,更多的Fragment需要使用FriendListAPI,我们需要在两个不同的地方进行注入,因此产生了许多重复代码。

因此,我们需要一个容器,它知道什么地方需要注入,注入什么样的对象。 

Dagger解决方案。

这里简单的展示轻量级依赖注入库Dagger实现的注入。
首先定义模块:
public class MyModule{@Provides @Singleton OkHttpClient provideOkHttpClient(){//这里可进行各种Http配置return new OkHttpClient();}@Provides @Singleton FriendListAPI provideFriendListAPI(){return newFriendListAPI();}
}

  初始化模块以及依赖对象图。

public class MyApplication extends Application{private ObjectGraph graph;@Override public void onCreate() {super.onCreate();graph = ObjectGraph.create(getModules().toArray());}protected List<Object> getModules() {return Arrays.asList(new MyModule(this));}public void inject(Object object) {graph.inject(object);}
}

  最后添加注入点并进行注入。

public abstract class BaseActivity extends FragmentActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);((MyApplication) getApplication()).inject(this);}
}public class FriendListFragment{@Inject FriendListAPI mFriendListAPI;......
}public class FriendListAPI{@Inject OkHttpClient mHttpClient;......
}

  如需进行单元测试,或使用可生成测试数据的模拟API,则再编写一个模块,在初始模块和依赖对象图时替换即可。

现有的依赖注入性能?

依赖注入虽能简化代码编写,方便单元测试,可是由于当前基于反射的依赖注入框架(Guice、RoboGuice)性能并不好。原因是他们会在程序运行的时候需要扫描代码中的注解,并需要花费内存映射到内存中。
这里推荐使用Dagger是因为它使用了编译时注解,也就是说在编译代码的时候,Dagger就已经完成传统依赖注入框架在运行时所执行的任务。

什么时候需要依赖注入?

当你需要将配置数据注入到一个或多个模块时。在开发过程中前端访问后台服务器地址会分为测试服务器和正式服务器,以及各种第三方分享key和ID,依赖注入都是非常好的选择。
当需要将同一依赖注入到多个模块时。如加载图片以及图片存储管理组件(Picasso, Android-Universal-Image-Loader)。
当需要对同一依赖注入不同的实现时。为方便开发和单元测试,后台API可有正式API和模拟API,通过依赖注入方便切换环境。
当同一模块需要注入不同的配置时。

参考资料:

http://square.github.io/dagger/

转载于:https://www.cnblogs.com/hellsong/p/4463569.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/492319.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工业富联2018年报来了!上市后首张成绩单大起底

未来智能实验室是人工智能学家与科学院相关机构联合成立的人工智能&#xff0c;互联网和脑科学交叉研究机构。未来智能实验室的主要工作包括&#xff1a;建立AI智能系统智商评测体系&#xff0c;开展世界人工智能智商评测&#xff1b;开展互联网&#xff08;城市&#xff09;云…

Opencv——图像膨胀

1、代码如下&#xff1a; #include "stdafx.h" #include <opencv2/opencv.hpp>using namespace cv;int main() {Mat srcImage imread("小狗1.jpg");imshow("原图像", srcImage);Mat dstImage;Mat element getStructuringElement(MORPH_…

深度学习背后的基础-神经网络揭秘

来源&#xff1a;混沌巡洋舰摘要&#xff1a;最近&#xff0c; 深度学习三杰获得了计算机界最重要的图灵奖&#xff0c; 它们的贡献都集中在对深度学习的根据神经网络的理论突破。 今天我们看到的所有和人工智能有关的伟大成就&#xff0c; 从阿法狗到自动驾驶&#xff0c; 从海…

Opencv——灰度变换、直方图均衡化

1、代码如下&#xff1a; #include "stdafx.h" #include <opencv2/opencv.hpp>using namespace cv;int main() {Mat srcImage imread("lena.bmp");Mat grayImage;cvtColor(srcImage, grayImage, COLOR_BGR2GRAY);Mat dstImage;equalizeHist(grayIm…

并发模型之——共享内存模型(线程与锁)理论篇

这里我们使用Java的线程与锁来解析共享内存模型&#xff1b;做过java开发并且了解线程安全问题的知道&#xff0c;要使某段代码是线程安全的那必须要满足两个条件&#xff1a;内存可见性、原子性&#xff1b; 内存可见性 在JVM规定多个线程进行通讯是通过共享变量进行的&a…

谷歌员工怒了 900人联名抗议 刚成立的AI道德委员会处境尴尬

来源&#xff1a;网易智能谷歌员工又怒了。3月26日&#xff0c;谷歌宣布成立人工智能项目外部顾问委员会&#xff0c;该委员会将与谷歌就面部识别和公平性等人工智能的主要问题进行磋商。争议的焦点在于&#xff0c;谷歌将保守派传统基金会(Heritage Foundation)主席凯科尔斯詹…

Opencv——基于索引表的图像细化

图像细化针对的是二值图像 或者用阀值处理的二值图像。基于索引表的细化算法大致是遍历被二值化图像的边缘&#xff0c;根据边缘点的八连通域情况查找索引表以确定该边缘点是否能够被删除。根据一些细化规则我们可以建立索引表&#xff0c;因此我们的主要工作就是不断地遍历边…

DeepMind推出首个商业产品,30秒内准确诊断眼疾!

来源&#xff1a;Financial Times、智东西编译摘要&#xff1a;这个设备能像最好的医学专家一样&#xff0c;准确地诊断各种眼部疾病。4月1日&#xff0c;谷歌母公司Alphabet旗下位于伦敦的AI部门DeepMind已打造出了可诊断复杂眼部疾病的商业医疗设备原型&#xff0c;这将是Dee…

Opencv——Sobel边缘检测

1、代码如下&#xff1a; #include "stdafx.h" #include <opencv2/opencv.hpp>using namespace cv;int main() {Mat srcImage imread("lena.jpg");Mat dstImage_x, dstImage_y;Sobel(srcImage, dstImage_x, CV_8U, 1, 0);Sobel(srcImage, dstImag…

Head first servlet and jsp学习笔记

学习中遇到的问题&#xff1a;java基础不行&#xff0c;都忘光了。 主要是&#xff1a;继承&#xff0c;接口&#xff0c;多线程&#xff0c;IO。尤其是多线程&#xff0c;在分布式系统中应该使用的比较多 第一章&#xff1a;前言和体系结构 HTTP协议&#xff1a; TCP/IP的上层…

一文解析|首个上榜科创板的机器人企业,江苏北人“闯关记”

来源&#xff1a;机器人大讲堂摘要&#xff1a;随着上交所公布了科创板首批受理上市申请的企业名单&#xff0c;这九家企业的每一家都被拿到放大镜下细细观察&#xff0c;评头论足。而其中&#xff0c;江苏北人作为登上科创版的首家机器人企业似乎受到的关注最多。江苏北人是一…

Matlab——绘制基础曲线

1、代码如下&#xff1a; close all;clear all;clc; %关闭所有图形窗口&#xff0c;清除工作空间所有变量&#xff0c;清空命令行 x0:0.02:10; y1sin(x); y22*sin(x); plot(x,y1,b*:,x,y2,r-); %设置颜色、标记和线型 axis([0 pi 0 2]); %设置坐标轴 title(正弦曲…

2018年中美独角兽研究报告

来源&#xff1a;前瞻产业研究院截至2018年12月31日&#xff0c;中国共有205家独角兽企业&#xff0c;占全球独角兽总量的48%&#xff0c;美国共有149家独角兽企业&#xff0c;占全球独角兽总量的35%。中美独角兽行业估值结构差异明显&#xff0c; 但总体看来&#xff0c;对于中…

Matlab——高斯白噪声处理

1、代码如下&#xff1a; close all;clear all;clc; %关闭所有图形窗口&#xff0c;清除工作空间所有变量&#xff0c;清空命令行 Iimread(eight.tif); Aimnoise(I,gaussian,0,0.05); %加入高斯白噪声 JA; M3; %设置叠加次数 Jim2double(J); Iim2…

中国首份自动驾驶路测报告:自主车企全面落后

来源&#xff1a;车云摘要&#xff1a;首份中国自动驾驶路测报告&#xff0c;透露着科技企业的野心和中国车企的无奈。近日&#xff0c;我国首份自动驾驶车辆道路测试年度报告出炉。这份由北京市发布的自动驾驶道路测试报告中&#xff0c;首次披露了自动驾驶相关企业&#xff0…

19个决定性时刻,2030年前,这些黑科技必将发生

来源&#xff1a;科技联盟技术中心摘要&#xff1a;从无人驾驶汽车到机器人工人&#xff0c;在我们熟悉所有这一切之前&#xff0c;未来正迎面走来。根据世界经济论坛全球议程理事会关于《未来软件与社会》的一份报告&#xff0c;到2025年前&#xff0c;很多新兴技术将会达到其…

推荐两本移动开发挺火的书

移动开发最好的入门书&#xff0c;而且例子实战特别多&#xff0c;是大学生的首选。 转载于:https://www.cnblogs.com/book2006/p/4487688.html

Matlab——图像缩放(插值法)

实验内容&#xff1a; 用双线性内插法实现位深度为8的灰度图像的缩放。 思路&#xff1a; 输入原图像以及缩放后图像的像素要求&#xff08;宽度*高度&#xff09;&#xff0c;处理后输出新图像。 我是用matlab来实现scale(input_img,scale_size)函数的&#xff0c;输入图像路径…

情感计算综述

来源&#xff1a;人机与认知实验室自然的齐一性指未检验过的物体将在某些相关的方面与我们已经检验过的同类物体相似。情感是人类智能的重要组成部分&#xff0c;是穿越理性的一把利器&#xff0c;然而&#xff0c;情感计算这一方向能否可行&#xff1f;如同形式化常识一样能否…

Matlab——对比度拉伸

1、代码如下&#xff1a; close all;clear all;clc; %关闭所有图形窗口&#xff0c;清除工作空间所有变量&#xff0c;清空命令行 Iimread(pout.tif); Jimadjust(I,[0.2 0.5],[0 1]);%将0.2-0.5之间的灰度扩展到整个0-1范围&#xff0c;这种处理 对于强调感兴趣灰度区非常有用…