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 ...
随机推荐
- PHP做负载均衡回话保持问题参考
最近一个项目的服务器老是出现Session数据丢失问题,导致用户莫名其妙的退出,原因是太相信我们的运维人员所谓的负载均衡会话保持的概念.会话保持 的原理就是负载均衡通过Cookie来分发那个客户连接被 ...
- hcharts中文网 一个js图表库
http://www.bossidc.com/info/gongju/2013/0717/2133.html hcharts源码包下载 http://www.hcharts.cn/demo/hig ...
- jquery.cookie实战用法详细解析
Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器(前提是 ...
- 在Unity3D中实现安卓平台的本地通知推送
[前言] 对于手游来说,什么时候需要推送呢?玩过一些带体力限制的游戏就会发现,我的体力在恢复满后,手机会收到一个通知告诉我体力已完全恢复了.这类通知通常是由本地的客户端发起的,没有经过服务端. 在安卓 ...
- IIS8中添加WCF支持几种方法小结[图文]
方法一 最近在做Silverlight,Windows Phone应用移植到Windows 8平台,在IIS8中测试一些传统WCF服务应用,发现IIS8不支持WCF服务svc请求,后来发现IIS8缺少 ...
- 动软模板系列二(Model层模板)
动软模板其实和CodeSmith的模板差不多 实现的原理是一样的,但是CodeSmith貌似只支持表生成,而且不够“国人化”,所以打算研究下动软的模板,如果熟练掌握后想必以后开发项目效率可以提高很多了 ...
- 在windows下运行spark
1.下载spark:spark-2.0.0-bin-hadoop2.7.tgz 2.解压至D:\bigdata\spark-2.0.0-bin-hadoop2.7 3.配置环境变量 HADOOP_HO ...
- Unity3D中如何计算场景中的三角面和顶点数
在做游戏开发时,场景中的三角面和顶点数影响着运行效率,尤其是在手机平台上,实时的知道场景中的各项指标,对性能优化来说至关重要,下面我们来实现一个小功能,来实时计算场景中的三角面和顶点数: 如果要知道场 ...
- easyui datagrid的json格式
easyui datagrid的json格式: {"columns":[[{"field":"one","title": ...
- linux脚本错误: line *: [: missing `]'
错误: line *: [: missing `]' 写脚本时,我碰到这个问题是因为if [ ]; ...else...fi语句 解决方法: if后面的[] (test) 和条件要有空格,如: 对于语 ...