【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 框架式编程.首先先介绍一下面向对 ...
随机推荐
- poj 1170 Shopping Offers
Shopping Offers Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 4696 Accepted: 1967 D ...
- WPF自定义窗口(Windows Server 2012 Style)
先上图 新建CustomControl,名:HeaderedWindow Themes\Generic.aml文件夹下加入 笔刷,转换器 <SolidColorBrush x:Key=" ...
- Android 安全概述
1. 保密: 信息.文档加密.解密 2. 鉴别.认证:就像确认与我们打电话的确实是XXX,而不是骗子 3. 完整性:信息不能被篡改, 4. 不可否认性:确定信息有who产生,并且将来不能否认
- iOS: 学习笔记, Swift与Objective-C混用简明教程(转载)
Swift与Objective-C混用简明教程 转载自:https://github.com/lifedim/SwiftCasts/tree/master/000_mix_swift_objc 我想很 ...
- SqlHelper 帮助文档及详解--项目初步搭建
微软SqlHelper类中文注释和使用方法 相关链接: http://blog.csdn.net/itmaxin/article/details/7609566 SqlHelper.cs是N年前微软出 ...
- 百度地图 - demo
项目需要集成百度地图,那么关于如何集成百度地图的事,就自己去百度开放平台查看文档吧,这是非常简单的事,在这里就不多说了. 那么下面我就说说我在这个demo里所做的事. 首先,项目需要具备定位及计算两地 ...
- PHP 之 Laravel 框架安装及相关开源软件
Laravel 被称为简洁.优雅的PHP开发框架,但第一次接触此框架的人有不少都卡在了安装上,其实在 Linux 下只需要很简单的几步就可以搞定,这里我们以 CentOS 下 PHP + Nginx ...
- 最完整的合并相交集合的Java代码(查并集)
这个是自己写的算法,如果有大牛,麻烦帮我并行化.初学者则可以学到不少东西. 产生测试用例 import java.io.*; import java.util.Random; public class ...
- 第1章(三)安装VS2015和Xamarin For VS
原文 第1章(三)安装VS2015和Xamarin For VS 操作系统:Win7 64位(sp1或更高版本) 1.安装VS2015 VS2015简体中文企业版:vs2015.ent_chs.is ...
- Python 入门教程 10 ---- Student Becomes the Teacher
第一节 1 练习 1 设置三个的字典分别为lloyd,alice,tyler 2 对每一个的字典的key都设置为"name","homework" , &quo ...