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