Android--带你一点点封装项目 MVP+BaseActivity+Retrofit+Dagger+RxJava(三)
1,这一篇博客是和大家一起来封装我们最后的Dagger2,其实之前也写过关于简单的Dagger2,这里是地址,完全没了解的同学可以先去看一下这篇,感谢很多小伙伴一直在耐心的等待这一篇
2,Dagger2可以说是些技术中最难上手的,不过把主要的四个注解理解到位了,基本上就可以用了:
@Inject Inject主要有两个作用,一个是使用在构造函数上,通过标记构造函数让Dagger2来使用(Dagger2通过Inject标记可以在需要这个类实例的时候来找到这个构造函数并把相关实例new出来)从而提供依赖,另一个作用就是标记在需要依赖的变量让Dagger2为其提供依赖。 @Provide 用Provide来标注一个方法,该方法可以在需要提供依赖时被调用,从而把预先提供好的对象当做依赖给标注了@Injection的变量赋值。provide主要用于标注Module里的方法 @Module 用Module标注的类是专门用来提供依赖的。有的人可能有些疑惑,看了上面的@Inject,需要在构造函数上标记才能提供依赖,那么如果我们需要提供的类构造函数无法修改怎么办,比如一些jar包里的类,我们无法修改源码。这时候就需要使用Module了。Module可以给不能修改源码的类提供依赖,当然,能用Inject标注的通过Module也可以提供依赖 @Component Component一般用来标注接口,被标注了Component的接口在编译时会产生相应的类的实例来作为提供依赖方和需要依赖方之间的桥梁,把相关依赖注入到其中。
下面你这张图片很相像的概括了上面四个标签的作用

还有两个常见的标签是@Scope和@Qulifier ,@Scope标签你可以将它理解成单例标记,@Qulifier可以简单的理解成区分需要的对象有两个或者两个以上构造方法(主要用于区分),
首先我们用一个简单的场景来引入吧,现在我们项目使用MVP架构, 而引入Dagger2的主要目的是解决我们在Activity中new Presenter对象,先看一下我们在引用之前代码是怎么样的吧
package com.qianmo.myview2; import android.support.v7.app.AppCompatActivity;
import android.os.Bundle; import com.qianmo.myview2.presenter.HiPresenterImpl; public class MainActivity extends AppCompatActivity { private HiPresenterImpl hiPresenter; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); //直接new对象
hiPresenter = new HiPresenterImpl();
}
}
这时候引用Dagger2,再看看我们的代码
MainActiivty.java
package com.qianmo.myview2; import android.support.v7.app.AppCompatActivity;
import android.os.Bundle; import com.qianmo.myview2.presenter.HiPresenterImpl; import javax.inject.Inject; public class MainActivity extends AppCompatActivity { @Inject
private HiPresenterImpl hiPresenter; //这里改变了 @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); }
}
Presenter.java
package com.qianmo.myview2.presenter;
import com.qianmo.myview2.contract.HiContract; import javax.inject.Inject; /**
* Created by MVPHelper on 2016/10/20
*/ public class HiPresenterImpl implements HiContract.Presenter{ @Inject
public HiPresenterImpl(){ } }
光上面的这两个标注还不够,我们还要创建对应的Module和Component
MainModule.java
package com.qianmo.myview2.di.module; import com.qianmo.myview2.presenter.HiPresenterImpl; import dagger.Module;
import dagger.Provides; /**
* Created by wangjitao on 2017/3/9 0009.
* E-Mail:543441727@qq.com
*/
@Module
public class MainModule {
@Provides
HiPresenterImpl provideHiPresenterImpl() {
return new HiPresenterImpl();
}
}
MainComponent.java
package com.qianmo.myview2; import android.support.v7.app.AppCompatActivity;
import android.os.Bundle; import com.qianmo.myview2.di.component.DaggerMainComponent;
import com.qianmo.myview2.di.module.MainModule;
import com.qianmo.myview2.presenter.HiPresenterImpl; import javax.inject.Inject; public class MainActivity extends AppCompatActivity { @Inject
private HiPresenterImpl hiPresenter; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); DaggerMainComponent.builder().mainModule(new MainModule()).build().inject(this);
hiPresenter.say();
}
}
这样我们就简单的使用了,再来简单的分析一下流程 :被 @Inject 注解的代码存在某种联系,当代码执行到 @Inject 的时候程序会自动进入到这个类的构造方法中,如果正巧这个构造方法也被 @Inject 修饰了,那么系统就会帮我们自动创建对象。
3,封装
由上面的项目我们进行过度,但我们封装的时候,主要是要在activity和fragment来持有Presenter对象,先来封装Activity,这是目录

先看一下我们之前的presenter的创建,在BaseActivity中添加抽象方法,在Mainactivity中重写方法再new对象


先创建Application的Module,Application的话主要是提供上下文环境,而appliacation中的component,只是提供Context展示方法get方法
AppModule.java
package com.qianmo.mvpproject.di.module; import com.qianmo.mvpproject.App;
import com.qianmo.mvpproject.di.ContextLife; import javax.inject.Singleton; import dagger.Module;
import dagger.Provides; /**
* Created by wwangjitao on 16/8/7.
*/ @Module
public class AppModule {
private final App application; public AppModule(App application) {
this.application = application;
} @Provides
@Singleton
@ContextLife("Application")
App provideApplicationContext() {
return application;
} }
AppComponent.java
package com.qianmo.mvpproject.di.component; import com.qianmo.mvpproject.App; import javax.inject.Singleton;
import com.qianmo.mvpproject.di.ContextLife;
import com.qianmo.mvpproject.di.module.AppModule; import dagger.Component; /**
* Created by wangjitao on 16/8/7.
*/ @Singleton
@Component(modules = AppModule.class)
public interface AppComponent { @ContextLife("Application")
App getContext(); // 提供App的Context }
而Activity的Module主要是提供Activity和上下文Context对象,对应的Activity的component主要是将提供的对象注入到需要它的地方
ActivityModule.java
package com.qianmo.mvpproject.di.module; import android.app.Activity;
import android.content.Context; import com.qianmo.mvpproject.base.BaseRxPresenter;
import com.qianmo.mvpproject.di.ActivityScope; import dagger.Module;
import dagger.Provides; /**
* Created by codeest on 16/8/7.
*/ @Module
public class ActivityModule {
private Activity mActivity; public ActivityModule(Activity activity) {
this.mActivity = activity;
} @Provides
@ActivityScope
public Activity provideActivity() {
return mActivity;
} @Provides
public Context provideContext() {
return mActivity;
} }
ActivityComponent.java
package com.qianmo.mvpproject.di.component; import android.app.Activity; import com.qianmo.mvpproject.di.ActivityScope;
import com.qianmo.mvpproject.di.module.ActivityModule;
import com.qianmo.mvpproject.ui.activity.CheckVersionActivity; import dagger.Component; /**
* Created by codeest on 16/8/7.
*/ @ActivityScope
@Component(dependencies = AppComponent.class, modules = ActivityModule.class)
public interface ActivityComponent { Activity getActivity(); void inject(CheckVersionActivity welcomeActivity); }
再在BaseActivity中去调用
BaseActivity.java
package com.qianmo.mvpproject.base; import android.app.Activity;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar; import javax.inject.Inject;
import com.qianmo.mvpproject.App;
import com.qianmo.mvpproject.R;
import com.qianmo.mvpproject.di.component.ActivityComponent;
import com.qianmo.mvpproject.di.component.DaggerActivityComponent;
import com.qianmo.mvpproject.di.module.ActivityModule; import butterknife.ButterKnife;
import butterknife.Unbinder; /**
* Created by wangjitao on 2016/11/8 0008.
* 基类Activity的封装
* 一般使用mvp模式的话会在BaseActivity中进行P和V的初始化绑定
*/
public abstract class BaseActivity<T extends BasePresenter> extends AppCompatActivity implements BaseView { //这里添加了注入
@Inject
protected T mPresenter; .......省略 protected void onCreate(@Nullable Bundle savedInstanceState) {
.......省略
super.onCreate(savedInstanceState);
setContentView(getLayout()); //这里添加了注入的调用
initInject(); if (mPresenter != null)
mPresenter.attachView(this); } //添加调用方法
protected ActivityComponent getActivityComponent(){
return DaggerActivityComponent.builder()
.appComponent(App.getAppComponent())
.activityModule(getActivityModule())
.build();
} protected ActivityModule getActivityModule(){
return new ActivityModule(this);
}
}
ok,这样我们就封装了,同理Fragment,这里就不废话写了,下面把github地址贴上,后面打算这些东西写一个展示类的app,又要到处找接口了,See You Next Time !
Android--带你一点点封装项目 MVP+BaseActivity+Retrofit+Dagger+RxJava(三)的更多相关文章
- Android--带你一点点封装项目 MVP+BaseActivity+Retrofit+Dagger+RxJava(一)
1,其实早就想把这些东西给封装封装的,一直没有时间,今天刚好项目进入到测试阶段了,Bug同事在哪儿测试的飞起,但发现提bug的尽然是我(得意脸),然后上午把ios的包测试了一下,顺便把服务器给测挂了( ...
- Android--带你一点点封装项目 MVP+BaseActivity+Retrofit+Dagger+RxJava(二)
1,昨天我们基本上把MVP给封装起来了,今天接着昨天的东西来结合RxJava把Retrofit把网络框架简单的封装一下,先看一下我们今天实现的效果: 哈哈 ,还是昨天的效果,好吧 ,我认错. 2,由于 ...
- Android App的设计架构:MVC,MVP,MVVM与架构经验谈
相关:http://www.cnblogs.com/wytiger/p/5996876.html 和MVC框架模式一样,Model模型处理数据代码不变在Android的App开发中,很多人经常会头疼于 ...
- Android App的设计架构:MVC,MVP,MVVM与架构AAAAA
1. 架构设计的目的1.1 通过设计使程序模块化,做到模块内部的高聚合和模块之间的低耦合.1.2 这样做的好处是使得程序在开发的过程中,开发人员只需要专注于一点,提高程序开发的效率,并且更容易进行后续 ...
- Android -- 带你从源码角度领悟Dagger2入门到放弃(二)
1,接着我们上一篇继续介绍,在上一篇我们介绍了简单的@Inject和@Component的结合使用,现在我们继续以老师和学生的例子,我们知道学生上课的时候都会有书籍来辅助听课,先来看看我们之前的Stu ...
- okhttputils【 Android 一个改善的okHttp封装库】使用(一)
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 本文使用的OKHttp封装库是张鸿洋(鸿神)写的,因为在项目中一直使用这个库,所以对于一些常用的请求方式都验证过,所以特此整理下. ...
- okhttputils【 Android 一个改善的okHttp封装库】使用(三)
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 这一篇主要讲一下将OkHttpUtils运用到mvp模式中. 数据请求地址:http://www.wanandroid.com/to ...
- Android二维码识别 开源项目ZXing的编译
Android二维码识别 开源项目ZXing的编译 Android端的条形码/二维码识别功能 因为手机端的输入不是很方便,所以条形码/二维码的扫描是一种很有效的解决手段. 比较流行的手机应用中,常用的 ...
- Android -- 带你从源码角度领悟Dagger2入门到放弃
1,以前的博客也写了两篇关于Dagger2,但是感觉自己使用的时候还是云里雾里的,更不谈各位来看博客的同学了,所以今天打算和大家再一次的入坑试试,最后一次了,保证最后一次了. 2,接入项目 在项目的G ...
随机推荐
- iOS 之 事件响应者链
响应者链表示一系列的响应者对象.事件被交由第一个响应者对象处理,如果第一个响应者不处理,事件就沿着响应者链向上传递,交由下一个响应者(Next responder). View->ViewCon ...
- U盘安装系统
http://www.ushendu.com/usdpzxt/1566.html http://www.ushendu.com/plus/view.php?aid=1571 http://www.ud ...
- JAVA中StringBuffer类常用方法
String是不变类,用String修改字符串会新建一个String对象,如果频繁的修改,将会产生很多的String对象,开销很大.因此java提供了一个StringBuffer类,这个类在修改字符串 ...
- oracle.jdbc.driver.OracleDriver和oracle.jdbc.OracleDriver这两个驱动的区别
http://blog.csdn.net/agromach/article/details/1659463
- [Echarts]用Echarts绘制饼状图
在项目网站的网页中,有这样一幅图: 心血来潮,想使用百度Echarts来绘制一下,可是没能绘制得完全一样,Echarts饼状图的label不能在图形下面放成一行,最后的效果是这样子的: 鼠标移动到it ...
- 自动化CodeReview - ASP.NET Core请求参数验证
自动化CodeReview系列目录 自动化CodeReview - ASP.NET Core依赖注入 自动化CodeReview - ASP.NET Core请求参数验证 参数验证实现 在做服务端开发 ...
- java.math.BigDecimal()的用法
Java中简单的浮点数类型float和double是不能进行运算的,不光Java,很多语言都是这样. 我们运行下面程序你将会看到 public class TestMathDecimal { publ ...
- 【闲聊PHP】编程界的萝莉小美女--PHP
本文地址 01 前言--上了贼船 不知道何时就上了PHP的贼船了,开始了web的开发,记得差不多两年前我还是做传统电子行业的人,就是嵌入式的方向,那时在天津或摆弄手机,或下煤窑摆弄电话,抑或就是在医疗 ...
- Mock以及Mockito的使用
mockito http://www.vogella.com/tutorials/Mockito/article.html 原文地址: http://www.open-open.com/lib/vie ...
- jQuery选择器课堂随笔
$(function(){ //并集选择器 /* $("h2,ul").css("background","pink");* ...