【Android - 框架】之Dagger2+MVP的用法
MVP模式本身相比于MVC模式就已经把View层和Controller层从Activity中进行了分离,将Model层和View层用Presenter层隔开,实现了初步的解耦。如果再加入Dagger2框架,就可以进一步解耦。
Dagger2使用的是依赖注入的思想,通过annotation注解的方式实现模块间的解耦,让“只写一小部分代码就可以使一切联系起来”成为了可能(削减了程序中的耦合问题)。Dagger是目前为止唯一一个可以生成完整模仿用户手写的可追踪的代码的DI框架。
Dagger2中有很多注解标签,其中一些及其功能列举如下:
- @Module:Modules类里面的方法专门提供依赖,所以我们定义一个类,用@Module注解,这样Dagger在构造类的实例的时候,就知道从哪里去找到需要的依赖。
- modules的一个重要特征是它们设计为分区并组合在一起(比如说,在我们的app中可以有多个组成在一起的modules)
- @Provides:在modules中,我们定义的方法是用这个注解,以此来告诉Dagger我们想要构造对象并提供这些依赖。
- @Singleton:当前提供的对象将是单例模式 ,一般配合@Provides一起出现
- @Component:用于接口,这个接口被Dagger2用于生成用于模块注入的代码
- @Inject:在需要依赖的地方使用这个注解。(你用它告诉Dagger这个 构造方法,成员变量或者函数方法需要依赖注入。这样,Dagger就会构造一个这个类的实例并满足他们的依赖。)
- @Scope:Dagger2可以通过自定义注解限定注解作用域。
这个DEMO中用到的标签只有前五个,@Scope标签暂时没有用到。
下面直接上代码。首先申明一下,这个DEMO中用到的MVP就不加介绍了,有兴趣的朋友可以通过最后的传送门到我上一个帖子中查看。
在gradle文件中添加依赖(主要是apt、dagger、butterknife有关的代码):
- apply plugin: 'com.android.application'
- apply plugin: 'com.neenbedankt.android-apt'
- android {
- compileSdkVersion 24
- buildToolsVersion "24.0.2"
- defaultConfig {
- applicationId "com.example.itgungnir.testdagger"
- minSdkVersion 11
- targetSdkVersion 24
- versionCode 1
- versionName "1.0"
- testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
- }
- buildTypes {
- release {
- minifyEnabled false
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
- }
- }
- }
- buildscript {
- repositories {
- jcenter()
- }
- dependencies {
- classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
- }
- }
- dependencies {
- compile fileTree(include: ['*.jar'], dir: 'libs')
- androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
- exclude group: 'com.android.support', module: 'support-annotations'
- })
- compile 'com.android.support:appcompat-v7:24.2.1'
- testCompile 'junit:junit:4.12'
- // Dagger的依赖包
- apt 'com.google.dagger:dagger-compiler:2.2'
- compile 'com.google.dagger:dagger:2.2'
- // ButterKnife的依赖包
- compile 'com.jakewharton:butterknife:5.1.1'
- }
MainActivity.java类中的代码:
- public class MainActivity extends AppCompatActivity implements MainContract.IView {
- @Inject
- MainPresenter presenter;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- // 初始化ButterKnife
- ButterKnife.inject(this);
- // Dagger注入
- DaggerMainComponent.builder().mainModule(new MainModule(MainActivity.this)).build().inject(this);
- }
- @OnClick(R.id.btn)
- public void click() {
- onButtonClicked("Button Clicked!!!!");
- }
- @Override
- public void onButtonClicked(String text) {
- presenter.onButtonClicked(MainActivity.this, text);
- }
- }
MainContract.java类中的代码:
- public class MainContract {
- interface IView {
- void onButtonClicked(String text);
- }
- interface IModel {
- void onButtonClicked(Activity activity, String text);
- }
- interface IPresenter {
- void onButtonClicked(Activity activity, String text);
- }
- }
MainModel.java类中的代码:
- public class MainModel implements MainContract.IModel {
- @Override
- public void onButtonClicked(Activity activity, String text) {
- Toast.makeText(activity, text, Toast.LENGTH_SHORT).show();
- }
- }
MainPresenter.java类中的代码:
- public class MainPresenter implements MainContract.IPresenter {
- private MainContract.IModel model;
- private MainContract.IView view;
- public MainPresenter(MainContract.IView view) {
- this.view = view;
- this.model = new MainModel();
- }
- @Override
- public void onButtonClicked(Activity activity, String text) {
- model.onButtonClicked(activity, text);
- }
- }
MainModule.java类中的代码:
- @Module
- public class MainModule {
- MainPresenter presenter;
- public MainModule(MainActivity activity) {
- presenter = new MainPresenter(activity);
- }
- @Provides
- @Singleton
- MainPresenter providesMainPresenter() {
- return presenter;
- }
- }
MainComponent.java接口中的代码:
- @Singleton
- @Component(modules = MainModule.class)
- public interface MainComponent {
- void inject(MainActivity activity);
- }
最后贴一下MVP的传送门地址:
【Android - 框架】之Dagger2+MVP的用法的更多相关文章
- 【Android - 框架】之MVP模式的使用
提起MVP架构模式,大家可能首先想到的是它的"前辈"MVC模式.MVC由Model.View.Controller组成,请求从Controller进入后进行业务判断,然后交给Mod ...
- 认清Android框架 MVC,MVP和MVVM
编者按:现在很多时候,我们都是面向搜索(或 Google 或百度).GitHub 编程,那么,在早期没有互联网的情况下,该如何学习编程,成为一名真正的开发者?亦或是作为一名小白,如何进入互联网编程时代 ...
- Rxjava + retrofit + dagger2 + mvp搭建Android框架
最近出去面试,总会被问到我们项目现在采用的什么开发框架,不过据我的经验网络框架(volley)+图片缓存(uIl)+数据库(orm)+mvp,不过现在这套框架比较好了,现在采用什么呢?Rxjava + ...
- Android二手交易平台,dagger2+mvp+Bmob后台云搭建
二手交易平台 我的毕业设计项目安卓源码,二手交易平台,dagger2+mvp+Bmob后台云搭建,集成了百度地图,友盟三方登录等 系统架构 Dagger2+MVP分层,完成了一次正常的retrofit ...
- 我们为什么要把Dagger2,MVP以及Rxjava引入项目中?
1Why? 我们为什么要把Dagger2,MVP以及Rxjava引入项目中? 毫无疑问在Android开发圈中这三个技术是经常被提及的,如此多的文章和开源项目在介绍他们,使用他们,开发者也或多或少的被 ...
- 转:Android开发中的MVP架构(最后链接资源不错)
Android开发中的MVP架构 最近越来越多的人开始谈论架构.我周围的同事和工程师也是如此.尽管我还不是特别深入理解MVP和DDD,但是我们的新项目还是决定通过MVP来构建. 这篇文章是我通过研究和 ...
- Android 架构艺术之MVP
MVP是Google官方发布的Android开发相关的架构知识.本文要讲解的是一种最基本的MVP的实现方式,它使用手动的依赖注入来提供具有本地和远程数据源的存储库.异步任务处理回调. 基本的MVP的项 ...
- App 组件化/模块化之路——Android 框架组件(Android Architecture Components)使用指南
面对越来越复杂的 App 需求,Google 官方发布了Android 框架组件库(Android Architecture Components ).为开发者更好的开发 App 提供了非常好的样本. ...
- Android 框架式编程 —— 起篇
一般的,在开发的时候,写过的代码在需求变更后,发现需要改动非常多的地方,那么说明之前的代码的架构肯定是存在问题的. 下面我们结合面向对象的六大基本原则谈Android 框架式编程.首先先介绍一下面向对 ...
随机推荐
- AS3的数据类型和定义
AS3的数据类型分: 基元数据类型:Boolean int(整数) Number(长的浮点数) unit(很大的正整数) String 复杂数据类型:Arrary Date Error ...
- C# Winform 开发框架
C/S系统开发框架-企业版 V4.0 (Enterprise Edition) 简介: http://www.csframework.com/cs-framework-4.0.htm 视频下载: 百度 ...
- 2016021902 - linux解压缩命令
转载自:http://blog.csdn.net/luo86106/article/details/6946255 .gz 解压1:gunzip FileName.gz 解压2:gzip -d Fil ...
- Windows命令行下pip安装python whl包
因为做网页爬虫,需要用到一个爬新闻的BeautifulSoup 的包,然后再关网上下的是whl包,第一次装,虽然花了点时间,最后还是装上去了,记录一下,方便下次. 先发一下官方文档地址.http:// ...
- 《深入剖析Tomcat》阅读(二)
Tomcat是基于Sun公司标准的开源Servlet容器. Servlet是什么? Servlet(Server Applet),全称Java Servlet,未有中文译文.是用Java编写的服务器端 ...
- wordpress 如何从后台数据库修改theme(图文教程)
我们在wordpress主题theme配置的时候,会从网站上下载比较流行的theme,使自己的blog看着很酷,也有不顺利的时候,你下载的theme有bug或者下载包出问题了,安装过后你的web页面不 ...
- app内购提示,您已购买此商品,但未下载
出现这样的问题,是支付没有finish造成的,一般在支付过程中断网了,下次再购买同一商品的时候就会出现这样的问题, 解决办法,在点击购买的时候判断支付队列中是否有为finish的商品,若有,则进行处理 ...
- 在keil中使用Astyle格式化你的代码的方法
一个好的程序,不仅要有好的算法,同时也需要有良好的书写风格.写出好的算法不容易,但是好的代码风格却并不困难.提到格式化代码,Astyle是一个不能错过的工具,它可以方便的将程序代码格式化成自己想要的样 ...
- 关于谷歌android 4.3 ble问题
随着BLE的逐渐壮大,越来越多的厂商开始支持BLE,在未来的一年里应该会慢慢普及,谷歌android4.3已经支持了自己的nexus4和uexus7 2013手机了,也就是说如果厂商采用谷歌已经实现d ...
- 【POJ】2528 Mayor's posters
离散化+线段树.数组开的不够大,wa了N多回. #include <iostream> #include <cstdio> #include <cstring> # ...