RxJava + Retrofit + Mvp + Dagger2初上手学习过程

在公司的日子项目做完之后总会有一段时间空白期,不写代码的时间怎么感觉过的这么慢,学习吧,学习还能打发一些时间之外增加自己的知识,程序员这个职业就是在不断被各种新技术学习摧残中成长的,面对一个新技术从看各种文章懵逼到一知半解,其实感觉最好的就是了解各大概之后埋头去敲代码,在踩过各种坑之后渐渐掌握的。

这两天看网上各种大神关于RxJava + Retrofit + Mvp + Dagger2的帖子,一看我擦这么多结合到一块,那该有多复杂啊,看着这都有了一种要放弃研究的念头,不过转念一想,作为一名有抱负的屌丝程序员怎么能被这几个加号给震慑住,打开AS,New Project,开始我的爬坑之路

网上找到一个大神开源的项目下载下来就开始了,https://github.com/JustWayward/BookReader

学习一个项目我喜欢的是从Application去研究,这个项目的Application只是比一般的项目多了这个

private  AppComponent  appComponent;点进去

@Component(modules= {AppModule.class,BookApiModule.class})

public interface AppComponent {

      ContextgetContext();

      BookApigetReaderApi();

}

开始看到这个@Component(modules= {AppModule.class,BookApiModule.class})这个是什么鬼,先没管,点击去AppModule.class,BookApiModule.class这两个类

每个里面都有一个@Module,到这就没法往下走了,百度查吧,因为完全没搞明白在往下走还是懵逼,

http://blog.csdn.net/wds1181977/article/details/51822043,看了一下这篇文章,原来才知道是Dagger2,而这些注解的意思:


@Inject: 通常在需要依赖的地方使用这个注解。换句话说,你用它告诉Dagger这个类或者字段需要依赖注入。这样,Dagger就会构造一个这个类的实例并满足他们的依赖。

@Module: Modules类里面的方法专门提供依赖,所以我们定义一个类,用@Module注解,这样Dagger在构造类的实例的时候,就知道从哪里去找到需要的 依赖。modules的一个重要特征是它们设计为分区并组合在一起(比如说,在我们的app中可以有多个组成在一起的modules)。

@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。


看的也一知半懂的,这块的意思大概就是AppComponent提供全局的对象以便于其他的组件依赖使用,比方context,api等,然后再Application中初始化一下,Application就完成了

/**

*初始化AppComponent组件

*/

private voidinitComponent() {

      appComponent=DaggerAppComponent.builder().

      bookApiModule(newBookApiModule()).

      appModule(newAppModule(this)).

      build();

}

下来就是BaseActivity,最主要的是

protected abstract void setupActivityComponent(AppComponent appComponent);

然后再onCreate中

setupActivityComponent(ReaderApplication.getInstance().getAppComponent());

这样子Activity继承BaseActivity的时候就可以持有AppComponent的对象进行Presenter的注册。

MainComponent,xxxComponent各种Component,个人理解写多个和写一个只是为了区分各个模块结构,当每个需要连接服务器去数据的

Activity或者Fragment都可以在这里面添加一条,记住就跟在AndroidManifest添加Activity一样

@Component(dependencies= AppComponent.class)

public interface MainComponent {

      MainActivityinject(MainActivityactivity);

      HomeFragmentinject(HomeFragmenthomeFragment);

      FindFragmentinject(FindFragmentfindFragment);

}

然后每个子Activity或者Fragment实现下面方法即可,当调用DaggerMainComponent没有出现自动补全的时候,可以按Crit+F9,

@Override

protected voidsetupActivityComponent(AppComponent appComponent) {

      DaggerMainComponent.builder()

      .appComponent(appComponent)

      .build()

      .inject(this);

}

这样Dagger2的大体需要的东西都部署完成了,之后就是MVP模式了,为了不写那么多的重复代码,还是先定义一个BaseContract,里面包含

BasePresenter和BaseView

public interface BaseContract{

   interface BasePresenter {

      void attachView(Tview);

      void detachView();

   }

   interface BaseView {

      void showError();

      void complete();

   }

}

基于Rx的Presenter封装,控制订阅的生命周期

public class RxPresenter implements BaseContract.BasePresenter{

}

之后为每个要去数据绑定的页面写一个BaseRVFragment或者BaseRVActivity继承BaseActivity或者BaseFargment

public abstract class BaseRVFragment<T1 extends BaseContract.BasePresenter> extends BaseFragment{

}

这样基本的就算完成了,之后每个页面需要绑定数据只需要添加两个类,一个是xxxContract,提供刷新页面的接口和去到数据的接口,一个是xxxPresenter,具体使用RxJava去调用接口取数据,接收数据等操作

public interface  xxxContract{

    interface  View  extends  BaseContract.BaseView{

        void  showTieziList(List list);

    }

    interface  Presenter  extends  BaseContract.BasePresenter{

        void  getTieizList(Stringpage,Stringpagesize);

    }

}

最后一步就算子的Activity或者Fragment继承BaseRVFragment等去具体实现,这个整个的流程就走完了,中间还有好多没有搞明白的东西,就是手写把整个流程走了一遍,然后记录下来,接下来准备自己写一个小项目在实践中去使用这样可以理解的更多,上面写的好多有些很浅显,但是基本的框架都已经分离出来,静下心来敲代码吧

项目代码已经上传Git,喜欢的就拿去继续敲代码吧

https://github.com/737297447/RxJava-Retrofit-Mvp-Dagger2--

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容