在公司的日子項目做完之后總會有一段時間空白期呼巷,不寫代碼的時間怎么感覺過的這么慢囱修,學習吧,學習還能打發(fā)一些時間之外增加自己的知識王悍,程序員這個職業(yè)就是在不斷被各種新技術(shù)學習摧殘中成長的破镰,面對一個新技術(shù)從看各種文章懵逼到一知半解,其實感覺最好的就是了解各大概之后埋頭去敲代碼,在踩過各種坑之后漸漸掌握的鲜漩。
這兩天看網(wǎng)上各種大神關(guān)于RxJava + Retrofit + Mvp + Dagger2的帖子源譬,一看我擦這么多結(jié)合到一塊,那該有多復雜啊孕似,看著這都有了一種要放棄研究的念頭踩娘,不過轉(zhuǎn)念一想,作為一名有抱負的屌絲程序員怎么能被這幾個加號給震懾住喉祭,打開AS养渴,New Project,開始我的爬坑之路
網(wǎng)上找到一個大神開源的項目下載下來就開始了,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就會構(gòu)造一個這個類的實例并滿足他們的依賴。
@Module: Modules類里面的方法專門提供依賴染厅,所以我們定義一個類痘绎,用@Module注解,這樣Dagger在構(gòu)造類的實例的時候肖粮,就知道從哪里去找到需要的 依賴孤页。modules的一個重要特征是它們設(shè)計為分區(qū)并組合在一起(比如說,在我們的app中可以有多個組成在一起的modules)涩馆。
@Provide: 在modules中行施,我們定義的方法是用這個注解,以此來告訴Dagger我們想要構(gòu)造對象并提供這些依賴魂那。
@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,個人理解寫多個和寫一個只是為了區(qū)分各個模塊結(jié)構(gòu)睹酌,當每個需要連接服務器去數(shù)據(jù)的
Activity或者Fragment都可以在這里面添加一條权谁,記住就跟在AndroidManifest添加Activity一樣
@Component(dependencies= AppComponent.class)
public interface MainComponent {
? ? ? MainActivityinject(MainActivityactivity);
? ? ? HomeFragmentinject(HomeFragmenthomeFragment);
? ? ? FindFragmentinject(FindFragmentfindFragment);
}
然后每個子Activity或者Fragment實現(xiàn)下面方法即可,當調(diào)用DaggerMainComponent沒有出現(xiàn)自動補全的時候忍疾,可以按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{
}
之后為每個要去數(shù)據(jù)綁定的頁面寫一個BaseRVFragment或者BaseRVActivity繼承BaseActivity或者BaseFargment
public abstract class BaseRVFragment<T1 extends BaseContract.BasePresenter> extends BaseFragment{
}
這樣基本的就算完成了甥绿,之后每個頁面需要綁定數(shù)據(jù)只需要添加兩個類,一個是xxxContract,提供刷新頁面的接口和去到數(shù)據(jù)的接口则披,一個是xxxPresenter,具體使用RxJava去調(diào)用接口取數(shù)據(jù)共缕,接收數(shù)據(jù)等操作
public interface ?xxxContract{
? ? interface ?View ?extends ?BaseContract.BaseView{
? ? ? ? void ?showTieziList(List list);
? ? }
? ? interface ?Presenter ?extends ?BaseContract.BasePresenter{
? ? ? ? void ?getTieizList(Stringpage,Stringpagesize);
? ? }
}
最后一步就算子的Activity或者Fragment繼承BaseRVFragment等去具體實現(xiàn),這個整個的流程就走完了士复,中間還有好多沒有搞明白的東西图谷,就是手寫把整個流程走了一遍翩活,然后記錄下來,接下來準備自己寫一個小項目在實踐中去使用這樣可以理解的更多便贵,上面寫的好多有些很淺顯菠镇,但是基本的框架都已經(jīng)分離出來,靜下心來敲代碼吧
項目代碼已經(jīng)上傳Git,喜歡的就拿去繼續(xù)敲代碼吧
https://github.com/737297447/RxJava-Retrofit-Mvp-Dagger2--