MVP模式本身相比于MVC模式就已经把View层和Controller层从Activity中进行了分离,将Model层和View层用Presenter层隔开,实现了初步的解耦。如果再加入Dagger2框架,就可以进一步解耦。

  Dagger2使用的是依赖注入的思想,通过annotation注解的方式实现模块间的解耦,让“只写一小部分代码就可以使一切联系起来”成为了可能(削减了程序中的耦合问题)。Dagger是目前为止唯一一个可以生成完整模仿用户手写的可追踪的代码的DI框架。

  Dagger2中有很多注解标签,其中一些及其功能列举如下:

  1. @ModuleModules类里面的方法专门提供依赖,所以我们定义一个类,用@Module注解,这样Dagger在构造类的实例的时候,就知道从哪里去找到需要的依赖。
  2. modules的一个重要特征是它们设计为分区并组合在一起(比如说,在我们的app中可以有多个组成在一起的modules
  3. @Provides:在modules中,我们定义的方法是用这个注解,以此来告诉Dagger我们想要构造对象并提供这些依赖。
  4. @Singleton:当前提供的对象将是单例模式 ,一般配合@Provides一起出现
  5. @Component:用于接口,这个接口被Dagger2用于生成用于模块注入的代码
  6. @Inject:在需要依赖的地方使用这个注解。(你用它告诉Dagger这个 构造方法,成员变量或者函数方法需要依赖注入。这样,Dagger就会构造一个这个类的实例并满足他们的依赖。)
  7. @ScopeDagger2可以通过自定义注解限定注解作用域。

  这个DEMO中用到的标签只有前五个,@Scope标签暂时没有用到。

  下面直接上代码。首先申明一下,这个DEMO中用到的MVP就不加介绍了,有兴趣的朋友可以通过最后的传送门到我上一个帖子中查看。

  在gradle文件中添加依赖(主要是apt、dagger、butterknife有关的代码):

  1. apply plugin: 'com.android.application'
  2. apply plugin: 'com.neenbedankt.android-apt'
  3.  
  4. android {
  5. compileSdkVersion 24
  6. buildToolsVersion "24.0.2"
  7. defaultConfig {
  8. applicationId "com.example.itgungnir.testdagger"
  9. minSdkVersion 11
  10. targetSdkVersion 24
  11. versionCode 1
  12. versionName "1.0"
  13. testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
  14. }
  15. buildTypes {
  16. release {
  17. minifyEnabled false
  18. proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
  19. }
  20. }
  21. }
  22.  
  23. buildscript {
  24. repositories {
  25. jcenter()
  26. }
  27. dependencies {
  28. classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
  29. }
  30. }
  31.  
  32. dependencies {
  33. compile fileTree(include: ['*.jar'], dir: 'libs')
  34. androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
  35. exclude group: 'com.android.support', module: 'support-annotations'
  36. })
  37. compile 'com.android.support:appcompat-v7:24.2.1'
  38. testCompile 'junit:junit:4.12'
  39. // Dagger的依赖包
  40. apt 'com.google.dagger:dagger-compiler:2.2'
  41. compile 'com.google.dagger:dagger:2.2'
  42. // ButterKnife的依赖包
  43. compile 'com.jakewharton:butterknife:5.1.1'
  44. }

  MainActivity.java类中的代码:

  1. public class MainActivity extends AppCompatActivity implements MainContract.IView {
  2. @Inject
  3. MainPresenter presenter;
  4.  
  5. @Override
  6. protected void onCreate(Bundle savedInstanceState) {
  7. super.onCreate(savedInstanceState);
  8. setContentView(R.layout.activity_main);
  9. // 初始化ButterKnife
  10. ButterKnife.inject(this);
  11. // Dagger注入
  12. DaggerMainComponent.builder().mainModule(new MainModule(MainActivity.this)).build().inject(this);
  13. }
  14.  
  15. @OnClick(R.id.btn)
  16. public void click() {
  17. onButtonClicked("Button Clicked!!!!");
  18. }
  19.  
  20. @Override
  21. public void onButtonClicked(String text) {
  22. presenter.onButtonClicked(MainActivity.this, text);
  23. }
  24. }

  MainContract.java类中的代码:

  1. public class MainContract {
  2. interface IView {
  3. void onButtonClicked(String text);
  4. }
  5.  
  6. interface IModel {
  7. void onButtonClicked(Activity activity, String text);
  8. }
  9.  
  10. interface IPresenter {
  11. void onButtonClicked(Activity activity, String text);
  12. }
  13. }

  MainModel.java类中的代码:

  1. public class MainModel implements MainContract.IModel {
  2.  
  3. @Override
  4. public void onButtonClicked(Activity activity, String text) {
  5. Toast.makeText(activity, text, Toast.LENGTH_SHORT).show();
  6. }
  7. }

  MainPresenter.java类中的代码:

  1. public class MainPresenter implements MainContract.IPresenter {
  2. private MainContract.IModel model;
  3. private MainContract.IView view;
  4.  
  5. public MainPresenter(MainContract.IView view) {
  6. this.view = view;
  7. this.model = new MainModel();
  8. }
  9.  
  10. @Override
  11. public void onButtonClicked(Activity activity, String text) {
  12. model.onButtonClicked(activity, text);
  13. }
  14. }

  MainModule.java类中的代码:

  1. @Module
  2. public class MainModule {
  3. MainPresenter presenter;
  4.  
  5. public MainModule(MainActivity activity) {
  6. presenter = new MainPresenter(activity);
  7. }
  8.  
  9. @Provides
  10. @Singleton
  11. MainPresenter providesMainPresenter() {
  12. return presenter;
  13. }
  14. }

  MainComponent.java接口中的代码:

  1. @Singleton
  2. @Component(modules = MainModule.class)
  3. public interface MainComponent {
  4. void inject(MainActivity activity);
  5. }

  最后贴一下MVP的传送门地址:

  【传送门】之MVP的使用

【Android - 框架】之Dagger2+MVP的用法的更多相关文章

  1. 【Android - 框架】之MVP模式的使用

    提起MVP架构模式,大家可能首先想到的是它的"前辈"MVC模式.MVC由Model.View.Controller组成,请求从Controller进入后进行业务判断,然后交给Mod ...

  2. 认清Android框架 MVC,MVP和MVVM

    编者按:现在很多时候,我们都是面向搜索(或 Google 或百度).GitHub 编程,那么,在早期没有互联网的情况下,该如何学习编程,成为一名真正的开发者?亦或是作为一名小白,如何进入互联网编程时代 ...

  3. Rxjava + retrofit + dagger2 + mvp搭建Android框架

    最近出去面试,总会被问到我们项目现在采用的什么开发框架,不过据我的经验网络框架(volley)+图片缓存(uIl)+数据库(orm)+mvp,不过现在这套框架比较好了,现在采用什么呢?Rxjava + ...

  4. Android二手交易平台,dagger2+mvp+Bmob后台云搭建

    二手交易平台 我的毕业设计项目安卓源码,二手交易平台,dagger2+mvp+Bmob后台云搭建,集成了百度地图,友盟三方登录等 系统架构 Dagger2+MVP分层,完成了一次正常的retrofit ...

  5. 我们为什么要把Dagger2,MVP以及Rxjava引入项目中?

    1Why? 我们为什么要把Dagger2,MVP以及Rxjava引入项目中? 毫无疑问在Android开发圈中这三个技术是经常被提及的,如此多的文章和开源项目在介绍他们,使用他们,开发者也或多或少的被 ...

  6. 转:Android开发中的MVP架构(最后链接资源不错)

    Android开发中的MVP架构 最近越来越多的人开始谈论架构.我周围的同事和工程师也是如此.尽管我还不是特别深入理解MVP和DDD,但是我们的新项目还是决定通过MVP来构建. 这篇文章是我通过研究和 ...

  7. Android 架构艺术之MVP

    MVP是Google官方发布的Android开发相关的架构知识.本文要讲解的是一种最基本的MVP的实现方式,它使用手动的依赖注入来提供具有本地和远程数据源的存储库.异步任务处理回调. 基本的MVP的项 ...

  8. App 组件化/模块化之路——Android 框架组件(Android Architecture Components)使用指南

    面对越来越复杂的 App 需求,Google 官方发布了Android 框架组件库(Android Architecture Components ).为开发者更好的开发 App 提供了非常好的样本. ...

  9. Android 框架式编程 —— 起篇

    一般的,在开发的时候,写过的代码在需求变更后,发现需要改动非常多的地方,那么说明之前的代码的架构肯定是存在问题的. 下面我们结合面向对象的六大基本原则谈Android 框架式编程.首先先介绍一下面向对 ...

随机推荐

  1. AS3的数据类型和定义

    AS3的数据类型分: 基元数据类型:Boolean  int(整数)  Number(长的浮点数)  unit(很大的正整数)  String 复杂数据类型:Arrary  Date  Error   ...

  2. C# Winform 开发框架

    C/S系统开发框架-企业版 V4.0 (Enterprise Edition) 简介: http://www.csframework.com/cs-framework-4.0.htm 视频下载: 百度 ...

  3. 2016021902 - linux解压缩命令

    转载自:http://blog.csdn.net/luo86106/article/details/6946255 .gz 解压1:gunzip FileName.gz 解压2:gzip -d Fil ...

  4. Windows命令行下pip安装python whl包

    因为做网页爬虫,需要用到一个爬新闻的BeautifulSoup 的包,然后再关网上下的是whl包,第一次装,虽然花了点时间,最后还是装上去了,记录一下,方便下次. 先发一下官方文档地址.http:// ...

  5. 《深入剖析Tomcat》阅读(二)

    Tomcat是基于Sun公司标准的开源Servlet容器. Servlet是什么? Servlet(Server Applet),全称Java Servlet,未有中文译文.是用Java编写的服务器端 ...

  6. wordpress 如何从后台数据库修改theme(图文教程)

    我们在wordpress主题theme配置的时候,会从网站上下载比较流行的theme,使自己的blog看着很酷,也有不顺利的时候,你下载的theme有bug或者下载包出问题了,安装过后你的web页面不 ...

  7. app内购提示,您已购买此商品,但未下载

    出现这样的问题,是支付没有finish造成的,一般在支付过程中断网了,下次再购买同一商品的时候就会出现这样的问题, 解决办法,在点击购买的时候判断支付队列中是否有为finish的商品,若有,则进行处理 ...

  8. 在keil中使用Astyle格式化你的代码的方法

    一个好的程序,不仅要有好的算法,同时也需要有良好的书写风格.写出好的算法不容易,但是好的代码风格却并不困难.提到格式化代码,Astyle是一个不能错过的工具,它可以方便的将程序代码格式化成自己想要的样 ...

  9. 关于谷歌android 4.3 ble问题

    随着BLE的逐渐壮大,越来越多的厂商开始支持BLE,在未来的一年里应该会慢慢普及,谷歌android4.3已经支持了自己的nexus4和uexus7 2013手机了,也就是说如果厂商采用谷歌已经实现d ...

  10. 【POJ】2528 Mayor's posters

    离散化+线段树.数组开的不够大,wa了N多回. #include <iostream> #include <cstdio> #include <cstring> # ...