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

你可能感兴趣的:(RxJava + Retrofit + Mvp + Dagger2初上手学习过程)