最近有小夥伴問我有沒有一個MVP+Dagger2+Retrofit2.0+Rxjava的案例,自己還沒完全集合實現。今天就介紹一個開源專案:owspace。基於MVP+Dagger2+Retrofit2.0+Rxjava的一款APP供大家去學習和參考。
owspace是一款高仿單讀的APP,API介面通過非法手段獲取。
你能學到
MVP模式
Retrofit2.0 + rxjava
- Dagger2
- jsoup解析DOM
- sqldelight SqlBrite
- 音視訊播放等
- some fucking source code
採用了mvp的模式和dagger2註解。
關於mvp的優勢:
模型與檢視完全分離,我們可以修改檢視而不影響模型
可以更高效地使用模型,因為所有的互動都發生在一個地方——Presenter內部
我們可以將一個Presenter用於多個檢視,而不需要改變Presenter的邏輯。這個特性非常的有用,因為檢視的變化總是比模型的變化頻繁。
如果我們把邏輯放在Presenter中,那麼我們就可以脫離使用者介面來測試這些邏輯(單元測試)
下面是mvp的架構圖:
關於mvp還可以參考:
Dagger2
看看Dagger2 的流程:
Dagger2的優點
全域性物件例項的簡單訪問方式
和ButterKnife 庫定義了view,事件處理以及資源的引用一樣,Dagger2 提供全域性物件引用的簡易訪問方式。宣告瞭單例的例項都可以使用@inject進行訪問。比如下面的MyTwitterApiClient 和SharedPreferences 的例項:
public class MainActivity extends Activity { @Inject MyTwitterApiClient mTwitterApiClient; @Inject SharedPreferences sharedPreferences; public void onCreate(Bundle savedInstance) { // assign singleton instances to fields InjectorClass.inject(this); }複製程式碼
複雜的依賴關係只需要簡單的配置
Dagger2 會通過依賴關係並且生成易懂易分析的程式碼。以前通過手寫的大量模板程式碼中的物件引用將會由它給你建立並傳遞到相應物件中。因此你可以更多的關注模組中構建的內容而不是模組中的物件例項的建立順序。
讓單元測試和整合測試更加方便
因為依賴關係已經為我們獨立出來,所以我們可以輕鬆的抽取出不同的模組進行測試。依賴的注入和配置獨立於元件之外。因為物件是在一個獨立、不耦合的地方初始化,所以當注入抽象方法的時候,我們只需要修改物件的實現方法,而不用大改程式碼庫。依賴可以注入到一個元件中:我們可以注入這些依賴的模擬實現,這樣使得測試更加簡單。
作用域例項(Scoped instances)
我們不僅可以輕鬆的管理全域性例項物件,也可以使用Dagger2中的scope定義不同的作用域。(比如根據user session,activity的生命週期)
效果圖:
宣告
單讀這個文藝的APP本人比較喜歡,一時衝動就抓取了資料,反編譯了APP。so,API介面是通過非法手段獲取,嚴禁商用,違者後果自負。
compile fileTree(include: ['*.jar'], dir: 'libs')
testCompile 'junit:junit:4.12'
compile(name: 'SildeMenulibrary-release', ext: 'aar')
compile(name: 'ObservableScrollView-release', ext: 'aar')
compile 'com.android.support:appcompat-v7:24.2.1'
compile 'com.jakewharton:butterknife:7.0.1'
compile 'com.google.code.gson:gson:2.6.2'
compile 'net.danlew:android.joda:2.9.3'
compile 'com.squareup.okhttp3:okhttp:3.4.1'
compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
compile 'com.squareup.sqlbrite:sqlbrite:0.7.0'
compile 'io.reactivex:rxandroid:1.2.1'
compile 'io.reactivex:rxjava:1.1.6'
compile 'com.github.bumptech.glide:glide:3.7.0'
compile 'com.github.bumptech.glide:glide:3.7.0'
compile 'com.orhanobut:logger:1.15'
compile 'com.elyeproj.libraries:loaderviewlibrary:1.2.1'
compile 'in.srain.cube:ultra-ptr:1.0.11'
compile 'com.android.support:recyclerview-v7:24.2.1'
compile 'com.android.support:design:24.2.1'
compile 'org.jsoup:jsoup:1.7.3'
compile 'pub.devrel:easypermissions:0.2.0'
compile 'com.wang.avi:library:2.1.3'
compile 'com.google.dagger:dagger:2.7'
apt 'com.google.dagger:dagger-compiler:2.7'
compile 'org.glassfish:javax.annotation:10.0-b28'
compile 'uk.co.chrisjenx:calligraphy:2.2.0'複製程式碼
專案地址:
相信自己,沒有做不到的,只有想不到的
如果你覺得此文對您有所幫助,歡迎入群 QQ交流群 :644196190
微信公眾號:終端研發部