我的Dagger2+Mvp+rxjava+retroft2.0

<h2>前言</h2>
做這個(gè)項(xiàng)目的初衷是想練手,因?yàn)楝F(xiàn)在rxjava+retrofit框架相當(dāng)火,而公司的同事正在用這個(gè)框架也覺得很方便,于是心癢難耐,決定學(xué)習(xí)這個(gè)框架。
<h3>理解圖</h3>


LT4UQ66~FZ`JSW$F13X$PUG.png

<h2>介紹</h2>Dagger2主要的作用就是依賴注入,我的理解就是當(dāng)配置好Dagger的時(shí)候,不論哪里想用只要一個(gè)@Inject就OK了,非常方便。比如在全局配置好 Gson,Glide,聯(lián)網(wǎng)框架等。(需要注意的是dagger2需要先寫好Component和module 然后AS Rebuild 自動(dòng)生成一個(gè)類,具體參考


DPY{E)V3NKUV~93KA5BXO6E.png

命名方法一般是你的Dagger+Component名字
例:DaggerApplicationComponent)
例子
<code>
App application();

SharedPreferences sharedPreferences();

Gson gson();

DataManager dataManager();

ApiService apiservice();

</code>
rxjava+retroft2.0這兩個(gè)我是一起用的,因?yàn)閞etofit2中有接口支持rxjava,兩者結(jié)合邏輯清晰,耦合性低,效率更高。
<code>
例:
return new Retrofit.Builder()
.baseUrl(zhihuUrl)
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
其中.addCallAdapterFactory(RxJavaCallAdapterFactory.create())就是相關(guān)接口。
</code>
開始
由于自己也是新學(xué)這個(gè)框架,理論方便也不是很通透,就不提太多理論了。打算結(jié)合著項(xiàng)目把這個(gè)框架盡量解讀出來,希望這個(gè)框架對(duì)大家以后的開發(fā)有所幫助。

<h3>一、配置gradle(添加依賴)</h3><h4>配置Dagger2</h4> 在主項(xiàng)目的build.gradle中添加
<code>
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
</code>
在Module的build.gradle中添加
<code>
compile 'com.google.dagger:dagger:2.6'
apt 'com.google.dagger:dagger-compiler:2.6'
</code>
<h4>配置RxJava+Retrofit2</h4><code> //retrofit2
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.okhttp3:okhttp:3.4.1'
compile 'com.squareup.okhttp3:logging-interceptor:3.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta3'
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.1'
//rxjava
compile 'io.reactivex:rxjava:1.1.0'
compile 'io.reactivex:rxandroid:1.1.0'
compile 'com.tbruyelle.rxpermissions:rxpermissions:0.7.0@aar'
compile 'com.jakewharton.rxbinding:rxbinding:0.4.0'
compile 'com.jakewharton.rxbinding:rxbinding-support-v4:0.4.0'
compile 'com.jakewharton.rxbinding:rxbinding-appcompat-v7:0.4.0'
compile 'com.jakewharton.rxbinding:rxbinding-design:0.4.0'
compile 'com.jakewharton.rxbinding:rxbinding-recyclerview-v7:0.4.0'

<h4>其他</h4>//Glide
compile 'com.github.bumptech.glide:glide:3.7.0'
//butterknife
compile 'com.jakewharton:butterknife:7.0.1'
</code>
配置到這里基本上就算完了,如果配置完還有什么錯(cuò)誤,可以參考我的項(xiàng)目源碼進(jìn)行配置,萬望海涵。(傳送門:
https://github.com/xiaoluYi/Yasuo

<h3>二、項(xiàng)目搭建。</h3>

<h5>我的工程目錄</h5>api:網(wǎng)絡(luò)配置
data: javabean
injector: Dagger2(component、module、scope)
mvp: module、view、presenter
ui: activity、adapter、base(基類)、fragment
utils: 工具類(很多都沒有用到)
widget: 空
APP: 全局App
Constants: 常量

首先App extends Application 在onCreat進(jìn)行Dagger2初始化.


[{C$}S_6SQCK2]3PS}OR9KR.png

ApplicationComponent為連接器(component),連接module和將要注入的class.


(~W~ELV98R3%(3NUJ(UW)RT.png

三個(gè)Module,
ApplicationModule (全局App)

DataModule 提供一個(gè)SharedPreferences對(duì)象
ApiModule 網(wǎng)絡(luò)連接

Module和Component關(guān)系
(Module類的上方應(yīng)注解為@Module,Component類上方注解@Component),
每個(gè)module里邊標(biāo)注@Provides的方法,都會(huì)返回一個(gè)對(duì)應(yīng)的實(shí)例,
例如:
ApplicationModule里邊
<code>
@Provides
@Singleton
public App provideApplication() {
return mApplication;
}
</code>
返回了一個(gè)mApplication(類型為App),對(duì)應(yīng)ApplicationComponent的 App application();<h6>需要注意的是返回的實(shí)例上需要標(biāo)注 @Provides(我理解的實(shí)例提供者)</h6>DataModule 對(duì)應(yīng)的 @Provides方法返回的是一個(gè)SharedPreferences實(shí)例。
ApiModule對(duì)應(yīng)的 @Provides方法返回的是一個(gè)ApiService實(shí)例。
(@Provides標(biāo)注的方法提供的實(shí)例 可在任意module的里邊直接使用,參見ApiModule.class)

這樣component和Modeule就配置完成了,返回App.class編譯。
<code>
private static ApplicationComponent mApplicationComponent;
mApplicationComponent = DaggerApplicationComponent.builder().
applicationModule(new ApplicationModule(this))
.dataModule(new DataModule())
.apiModule(new ApiModule())
.build();
</code>
<h6>命名規(guī)則(Dagger+ApplicationComponent)</h6>

Build-------ReBuild Project;
全局的Dagger2配置完成。
使用方式,
<code>
@Inject
ApiService apiservice;(后邊會(huì)繼續(xù)講解)
</code>
<h3>配置Retrofit2+Rxjava</h3>配置主要是在剛才的ApiModule.class配置.
首先
<code>
@Provides
@Singleton
//這個(gè)類提供一個(gè)Retrofit 實(shí)例
Retrofit provideRetrofit(OkHttpClient okHttpClient) {
return new Retrofit.Builder()
//例如我是用的是知乎日?qǐng)?bào)api( String zhihuUrl = "http://news-at.zhihu.com/api/4/";)
.baseUrl(zhihuUrl)
//聯(lián)網(wǎng)方式okhttp3(需要一個(gè)okHttpClient實(shí)例)
.client(okHttpClient)
//Gson解析工廠(需要一個(gè)Gson解析工廠實(shí)例,這里用的是最簡單的系統(tǒng)提供的,一般需 要重寫GsonConverterFactory的子類來保證數(shù)據(jù)的安全性)
.addConverterFactory(GsonConverterFactory.create())
//重點(diǎn):這一步是retrofit2與rxjava結(jié)合的重要步驟(retrofit2為rxjava提供的支持接口)
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
}
</code>
需要一個(gè)okHttpClient實(shí)例<code>
@Provides
@Singleton
OkHttpClient provideOkHttpClient(@ForApplication Context context) {
OkHttpClient.Builder builder = new OkHttpClient.Builder()
.connectTimeout(15 * 1000L, TimeUnit.MILLISECONDS)//15
.readTimeout(20 * 1000L, TimeUnit.MILLISECONDS)//20
.writeTimeout(30 * 1000L, TimeUnit.MILLISECONDS)//15
.cache(new Cache(new File(CacheUtil.getHttpCacheDir(context), OKCLIENT_DISK_CACHE_NAME),
OKCLIENT_DISK_CACHE_SIZE)); //設(shè)置緩存目錄和20M緩存
return builder.build();
}
</code>
這些配置好了以后Retrofit的實(shí)例配置完成,這樣調(diào)用
<code>
@Provides
@Singleton
ApiService provideApiService(Retrofit retrofit) {
return retrofit.create(ApiService.class);
}
返回一個(gè)ApiService對(duì)應(yīng)@Component ApplicationComponent 的
//retrofit2
ApiService apiservice();
</code>
這樣就算簡單的配置好了。使用的時(shí)候這樣用(最簡單的一種使用方式)
<code>
@Inject
ApiService apiService;

apiService.getData()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<TitileBean>() {
@Override
public void onCompleted() {
//網(wǎng)絡(luò)請(qǐng)求完成
}
@Override
public void onError(Throwable e) {
//網(wǎng)絡(luò)請(qǐng)求失敗
}
@Override
public void onNext(TitileBean titileBean) {
//網(wǎng)絡(luò)請(qǐng)求成功
}
});
apiService.getData()方法是在ApiService.class(剛才配置過)
//get方式請(qǐng)求
@GET("themes")
Observable <TitileBean> getData();
</code>
<h3>三、基類avtivity的Dagger2配置</h3>類名: ui.base.BaseAct
(通常情況下每個(gè)Activity會(huì)對(duì)應(yīng)一個(gè)Component,那現(xiàn)在就為BaseAct創(chuàng)建一個(gè)ActivityComponent:
<code>
@ActivityScope
@Component(dependencies = ApplicationComponent.class, modules = ActivityModule.class)
public interface ActivityComponent {
void inject(GuiderActivity guiderActivity);
void inject(MainAct mainAct);
}
</code>
這里就把AppComponent中提供的一些對(duì)象依賴了過來,實(shí)現(xiàn)了全局共用。同時(shí)聲明一個(gè)inject方法,參數(shù)是你要注入到的類。
<code>
public ActivityComponent getActivityComponent() {
if (mActivityComponent == null) {
mActivityComponent = DaggerActivityComponent.builder()
.applicationComponent(App.getApplicationComponent())
.activityModule(new ActivityModule(this))
.build();
}
return mActivityComponent;
}
</code>
關(guān)于MVP主要是幾個(gè)基類的配置和相互關(guān)聯(lián),可以看我的ui.base里邊的幾個(gè)基類,看不懂的話直接拿來用也可以。

第一次寫技術(shù)文章,由于自己才疏學(xué)淺,技術(shù)不扎實(shí),萬望海涵。
<h4>參考文章:</h4>我的Dagger2學(xué)習(xí)歷程:從一頭霧水到恍然大悟(https://gold.xitu.io/post/58722866128fe1006b33e104
Android 手把手教你使用Retrofit2:(http://www.itdecent.cn/p/73216939806a
噢~這就是Dagger2!
http://www.itdecent.cn/p/4db940c8da97
項(xiàng)目借鑒知乎API:(https://github.com/izzyleung/ZhihuDailyPurify/wiki/%E7%9F%A5%E4%B9%8E%E6%97%A5%E6%8A%A5-API-%E5%88%86%E6%9E%90

<h5>一點(diǎn)想法:</h5>當(dāng)初只是簡單的想學(xué)習(xí)一下rxjava+retofit2,后來就想著把dagger2也加進(jìn)去,剛好公司大神對(duì)Mvp比較熟悉,就一起學(xué)習(xí)了。本文是在公司大神的參照下寫的項(xiàng)目,期間看了掘金的許多技術(shù)文章、git的Dagger2 most star的許多項(xiàng)目,對(duì)這些無私的作者和大神表示感謝。但是由于基礎(chǔ)較差一直理解不了dagger2,一度想過放棄,因?yàn)闊o法生成DaggerApplicationComponent這個(gè)編譯的類,惱火了很久?,F(xiàn)在把自己的一些經(jīng)驗(yàn)給寫出來,希望共勉。如果對(duì)該項(xiàng)目有什么不解,請(qǐng)留言,我有時(shí)間都會(huì)回復(fù)的(在我能力范圍之內(nèi))。

如果我的項(xiàng)目對(duì)你有所幫助,請(qǐng)隨手star,多謝。
傳送門:https://github.com/xiaoluYi/Yasuo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容