概述

  • 在2016年5,6月份开始在知乎上看到开发方法,那时候记得是看mvc,mvp,mvvm这三种开发模式区别,后面进一步了解到google在github上开源了使用这3种模式进行Android开发的demo.不同的项目有不同的情况,开发项目是找一个最适合的,而不是性能最好,开发时间最短等。

  • MVP是一种开发模式或者架构,RxJava与Retrofit是两个库,前面的是异步的库,后面的是提供Restful请求的库,这两个库都是为了MVP开发模式服务的。当然,他的适用场景是业务逻辑复杂的项目,也就是解决控制层耦合性太高。

  • Dagger2库,RxJava库,Retrofit库会进行简单介绍,了解其运作的机制。

Dagger2库

关键概念

  • Inject--你用它告诉Dagger这个类或者字段需要依赖注入

  • Module-- Modules类里面的方法专门提供依赖,所以我们定义一个类,用@Module注解,这样Dagger在构造类的实例的时候,就知道从哪里去找到需要的依赖

  • Provide--在modules中,我们定义的方法是用这个注解,以此来告诉Dagger我们想要构造对象并提供这些依赖。

  • Component--Components从根本上来说就是一个注入器,也可以说是@Inject和@Module的桥梁,它的主要作用就是连接这两个部分。 Components可以提供所有定义了的类型的实例,比如:我们必须用@Component注解一个接口然后列出所有的@Modules组成该组件,如 果缺失了任何一块都会在编译的时候报错。所有的组件都可以通过它的modules知道依赖的范围。

  • Scope-- Scopes可是非常的有用,Dagger2可以通过自定义注解限定注解作用域。后面会演示一个例子,这是一个非常强大的特点,因为就如前面说的一样,没 必要让每个对象都去了解如何管理他们的实例。在scope的例子中,我们用自定义的@PerActivity注解一个类,所以这个对象存活时间就和 activity的一样。简单来说就是我们可以定义所有范围的粒度(@PerFragment, @PerUser, 等等)。

  • Qualifier--当类的类型不足以鉴别一个依赖的时候,我们就可以使用这个注解标示。例如:在Android中,我们会需要不同类型的context,所以我们就可以定义 qualifier注解“@ForApplication”和“@ForActivity”,这样当注入一个context的时候,我们就可以告诉 Dagger我们想要哪种类型的context。

如何在MVP中使用

创建BasePresenter与BaseView

  • MVP架构中M与V通过P进行交互,activity用来显示不再负责具体业务逻辑,职责明确,便于测试;

  • BasePresenter与BaseView抽象出视图中公共的行为,可以在activity或者fragment中实现BaseView的子类,渲染界面;

public interface BasePresenter {

    //订阅
void subscribe(); //解订
void unsubscribe();
} public interface BaseView<T> { void setPresenter(T presenter);//view中设置处理器 }

创建处理器(MVP中的P)

1.新建MineContract,view与presenter的抽象接口集合,相当于讲下要去做那些事情

public interface MineContract {

    interface View extends BaseView<Presenter>{

        void login_success(String response);

        void login_failure(String msg);

        void network_exception(int errcode);

        void network_normal();

    }

    interface Presenter extends  BasePresenter{

        void login(User user);

    }

2.新建MinePresenter,实现MineContract.Presenter接口方法,相当于事情具体怎么去做

public class MinePresenter implements MineContract.Presenter {

    private final static String TAG="MinePresenter";

    private MineContract.View mView;

    public MinePresenter(MineContract.View view) {
this.mView = view;
this.mView.setPresenter(this);
} @Override
public void subscribe() { } @Override
public void unsubscribe() { } @Override
public void login(User user) { new Handler().postDelayed(new Runnable() {
@Override
public void run() {
mView.login_success("success");
Log.d(TAG,"logined");
}
},500); }
}

创建实体(MVP中的M)

创建User类,作为登录测试

public class User {

    private String uId;

    private  String uName;

    private String uPwd;

    private String uType;

    private String uLevel;

   //省略set与get方法
}

创建界面(MVP中的V)

  • 创建MainActivity,采用嵌套fragment方式,继承自FragmentActivity
public class MainActivity extends FragmentActivity  {

    private FragmentManager mFragMgr;

    @Inject
MinePresenter presenter; private MineFragment mineFragment; private final String MINE = "Mine"; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mFragMgr = getSupportFragmentManager();
initFragments();
showFragments(MINE,true);
} private void initFragments() {
mineFragment = new MineFragment();
} private void showFragments(String tag, boolean init) {
FragmentTransaction trans = mFragMgr.beginTransaction();
if (init) {
trans.add(R.id.main_content, getFragmentByTag(tag), tag);
trans.addToBackStack(tag);
} else {
trans.replace(R.id.main_content, getFragmentByTag(tag), tag);
}
trans.commit();
} private Fragment getFragmentByTag(String tag) {
if (MINE.equals(tag)) {
return mineFragment;
}
return null;
} }
  • 创建MineFragment,需要实现implements MineContract.View接口
public class MineFragment extends Fragment implements MineContract.View {
//省略部分代码 @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
} @Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
uName = (LikeEditText) view.findViewById(R.id.uName);
uPwd = (LikeEditText) view.findViewById(R.id.uPwd);
loginBtn = (Button) view.findViewById(R.id.login_btn);
loginBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
User user=new User();
user.setuName(uName.getText().toString());
user.setuPwd(uPwd.getText().toString());
minePresenter.login(user);
}
});
}

前面讲的都是mvp架构基本搭建,下面是如何运用dagger2;

创建提供应用实例的AppComponent

一个应用在创建时会产生唯一的Application对象,可以在应用的onCreate函数创建,下面有几个步骤:

1.创建提供应用对象的Component

1.1创建提供应用对象的Module

@Module
public class AppModule { private Context mContext; public AppModule(Context context){
this.mContext=context;
} @Provides
public Context provideContext(){
return this.mContext;
} }

1.2创建AppComponent为其他Component提供依赖

@Component(modules = AppModule.class)
public interface AppComponent {
Context getContext();
}
2.构建AppComponent的实例
public class SampleApplication extends Application {

    private AppComponent appComponent;

    private static SampleApplication mInstance;

    @Override
public void onCreate() {
super.onCreate();
mInstance=this;
appComponent=DaggerAppComponent.builder().appModule(new AppModule(this)).build();
} public static SampleApplication getInstance(){
return mInstance;
} public AppComponent getAppComponent(){
return appComponent;
} }

在MainActivity如何自动注入MinePresenter

  • 1.修改MinePresenter代码-构造方法注入
  @Inject
public MinePresenter(MineContract.View view) {
this.mView = view;
this.mView.setPresenter(this);
}
  • 2.创建MinePresenterModule-提供MineContract.View实例
@Module
public class MinePresenterModule { private final MineContract.View mView; public MinePresenterModule(MineContract.View view) {
mView = view;
} @Provides
MineContract.View provideStatisticsContractView() {
return mView;
}
}
  • 3.修改MainComponent
@Component(dependencies = AppComponent.class,modules = MinePresenterModule.class)
public interface MainComponent {
MineFragment inject(MineFragment mineFragment); MainActivity inject(MainActivity mainActivity);
}
  • 4.修改MainActivity代码-成员变量注入与注入MineFragment
 @Inject
MinePresenter presenter; private void initFragments() {
mineFragment = new MineFragment();
DaggerMainComponent.builder().minePresenterModule(new MinePresenterModule(mineFragment)).appComponent(SampleApplication.getInstance().getAppComponent()).build().inject(this); }

以上所有的步骤已完成,编译项目,dagger2自动生成相关类,并完成注入。

总结

  • 创建module,一般应用于第三方包对象或者应用对象
  • 创建Component,依赖注入器,复杂把注入对象注入到注解成员变量

构造方法注入:在类的构造方法前面注释@Inject

成员变量注入:在类的成员变量(非私有)前面注释@Inject

如何使用MVP+Dagger2+RxJava+Retrofit开发(1)的更多相关文章

  1. MVP+Dagger2+Rxjava+Retrofit+GreenDao 开发的小应用,包括新闻、图片、视频3个大模块,代码封装良好

    练习MVP架构开发的App,算是对自己学过的知识做一个总结,做了有一段时间,界面还算挺多的.代码量还是有的,里面做了大量封装,总体代码整理得非常干净,这个我已经尽力整理了. 不管是文件(java.xm ...

  2. MVP+Dagger2+Rxjava+Retrofit+GreenDao 小应用,包含新闻、图片、视频3个大模块,代码整洁干练

    练习MVP架构开发的App,算是对自己学过的知识做一个总结,做了有一段时间,界面还算挺多的,代码量还是有的,里面做了大量封装,整体代码整理得很干净,这个我已经尽力整理了.不管是文件(Java.xml. ...

  3. 手把手带你走进MVP +Dagger2 + DataBinding+ Rxjava+Retrofit 的世界

    0.0 Android开发现在的变化用一个词来形容就是 :翻天覆地 越来越多的项目使用了MVP + Rxjava+Retrofit +Dagger2 + DataBinding等等东西.. 但是这些东 ...

  4. android完整资讯App、Kotlin新闻应用MVP + RxJava + Retrofit + Dagger2、优雅区间选择器等源码

    Android精选源码 Android完整资讯客户端源码 android展示注册进度效果源码 Android Wifi热点数据传输Socket 通信示例源码 Android Dota的辅助信息app源 ...

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

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

  6. 开发 Material Design+RxJava+Retrofit+MVP App 参考资料

    前言     在开发一个基于 Material Design+RxJava+Retrofit+MVP 框架的 App 过程中学习的资料整理 —— 由G军仔分享 这里记录了我开发 大象 项目时,所学习的 ...

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

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

  8. Rxjava+retrofit+mvp整合

    转载请标明出处: http://blog.csdn.net/forezp/article/details/52621898 本文出自方志朋的博客 最近在看Rxjava,写了一个简单的 demo整合了R ...

  9. android打飞机游戏、MVP句子迷App、悬浮窗、RxJava+Retrofit、加载动画、定制计划App等源码

    Android精选源码 微信打飞机 android进度设置加载效果源码 Android新手引导库EasyGuide MVP-好看又好用的句子迷客户端 XFloatView 一个简易的悬浮窗实现方案 a ...

随机推荐

  1. 【踩坑记录】记一次MySQL主从复制延迟的坑

    最近开发中遇到的一个MySQL主从延迟的坑,记录并总结,避免再次犯同样的错误. 情景 一个活动信息需要审批,审批之后才能生效.因为之后活动要编辑,编辑后也可能触发审批,审批中展示的是编辑前的活动内容, ...

  2. [Tool] Git 使用 与 Git Flow

    目录 简介 Git 命令 Git Flow 简介 Git是目前世界上最先进的分布式版本控制系统(没有之一). Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!一个月之内,Lin ...

  3. Matlab: 路径的操作

    添加相对路径 在matlab中当代码很多时常常将结果存在不同的文件夹下面,常常使用相对路径对函数进行调用,但有时会存在问题.举个栗子: 代码结构如下: /codes/A/AA/code1.m /cod ...

  4. supervisor 安装配置

    Supervisor介绍 Supervisor 允许其用户在UNIX类操作系统上控制多个进程. 块如下: 方便 需要为每个进程实例编写rc.d脚本通常是不方便的. rc.d脚本是进程初始化/自动启动/ ...

  5. PHP数字价格格式化,保留两位小数

    number_format(($v['cash']/100),2); demo=>9,271.15

  6. jq-animate实现返回顶部效果

    jq-animate实现返回顶部效果: <!doctype html> <html lang="en"> <head> <meta cha ...

  7. JavaScript函数部分

    函数部分学习:+parseInt(): -parseInt()函数将其收到的任何输入值(通常是字符串)转换成整数类型输出,如果转换失败就返回NaN. -parseInt(“参数”,第二参数基数):没有 ...

  8. word2-寻找社交新浪微博中的目标用户

    项目简述: 为了进行更加精准的营销, 利用数据挖掘相关算法, 利用开放API或自行编写爬虫获得新浪微博, 知乎等社交网络(可能需要破解验证码)中用户所发布的数据, 利用数据挖掘的相关算法进行分析, 从 ...

  9. MySQL(二)--事务与视图

    一.事务 1.提交 2.回滚 3.ACID特性 二.视图 1.创建视图 2.删除视图 3.更新视图 4.使用视图 三.子查询 1. 使用子查询 2. 标量子查询 3. 关联子查询 一.事务 在 RDB ...

  10. Java面试常考------------------------垃圾收集算法

    对于Java系学生而言,Java虚拟机中的垃圾收集算法是一个很重要的面试考点. 常用的垃圾收集算法主要可划分为以下三类: 1. 标记-清除算法 标记清除算法是一种比较简单的方法,直接标记内存中待回收的 ...