android mvvm框架搭建_轻松搭建基于JetPack组件的MVVM框架
原文鏈接:輕松搭建基于JetPack組件的MVVM框架 - 掘金
Brick
github gitee
介紹
輔助android開發者搭建基于JetPack組件構建MVVM框架的注解處理框架。通過注解自動生成ViewModel的Factory類、lazy方法等;支持在項目的任意位置注入ROOM的dao層接口與Retrofit庫中的api接口。
特點
android開發者可以將brick理解為一個輕量級的注入框架,使用非常簡單,使用4-6個注解即可工作。brick主要在編譯期工作, 不會在App運行時產生任何額外的性能消耗 ,并且只有1個注解庫會打包到你的android工程中,不用擔心體積增大的問題。
適用范圍
引入
使用
一、 @Provide注解的使用方法:
- 在Terminal終端上輸入gradlew :[ModuleName]:kaptDebugKotlin運行腳本;
- 在AndroidStudio右側Gradle擴展欄中依次找到[PrjectName] -> [ModuneName] -> Tasks -> other -> kaptDebugKotlin并雙擊運行腳本;
- Ctrl + F9編譯整個項目。以上三種方式任選其一即可運行brick注解處理器。
- lazyWxAuthorViewModel()擴展方法,在Activity或Fragment中直接調用即可。
- get()方法,在不方便使用lazy方法時,可使用此方法獲取ViewModel的實例。注:lazyWxAuthorViewModel方法就是對get()方法的包裝。
直接使用生成的方法,即可創建對應的ViewModel實例:
或在onCreate()之后,通過get創建:
private lateinit var wxAuthorViewModel: WxAuthorViewModeloverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)wxAuthorViewModel = get(this) } 復制代碼二、 @Inject注解的使用方法
-2. (必需) 在獲取Retrofit實例的方法上添加@RetrofitInstance,如:
@RetrofitInstance val retrofit: Retrofit by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {Retrofit.Builder().client(okHttpClient).baseUrl(WANDROID_BASE_URL).addConverterFactory(MoshiConverterFactory.create()).build() }val okHttpClient: OkHttpClient by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {val logInterceptor = HttpLoggingInterceptor()logInterceptor.level = HttpLoggingInterceptor.Level.BODYOkHttpClient.Builder().addInterceptor(logInterceptor).callTimeout(15, TimeUnit.SECONDS).readTimeout(60, TimeUnit.SECONDS).writeTimeout(60, TimeUnit.SECONDS).connectTimeout(15, TimeUnit.SECONDS).build() } 復制代碼注:@RetrofitInstance注解只能標記在public修飾的val屬性上或方法上,val屬性上或方法可以在object 單例或companion object中,也可以是包級屬性/方法。
-1. (可選) 在獲取RoomDatabase實例的屬性或方法上標記@RoomInstance,如:
@RoomInstance val wandroidDatabase: WandroidDatabase by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {Room.databaseBuilder(CONTEXT, WandroidDatabase::class.java, "wandroid.db").build() } 復制代碼注:@RoomInstance注解只能標記在public修飾的val屬性上或方法上,val屬性上或方法可以在object 單例或companion object中,也可以是包級屬性/方法。
標記后,繼續編寫業務代碼即可,所有被@Inject標記的字段,都會在編譯期自動獲取或創建實例,無需擔心它們在何時被賦值。注:雖然是lateinit var修飾的字段,但是不要嘗試為它們賦值,這會導致致命的錯誤。注:@Inject可以注入的類型只有Retrofit的api接口和ROOM的dao接口、以及有無參構造的類。
三、 多服務器或多端口的處理方法:
假設有另一個Retrofit api接口,它的訪問地址或端口與baseUrl中的不一樣,此時,可以在Retrofit的api接口上添加@Port和@Url注解來設置它們的url或port。
添加此注解后,brick會在編譯期根據@RetrofitInstance注解標記的Retrofit實例和@Port的端口號,重新創建一個Retrofit實例,并使用新的Retrofit實例創建ArticleApi的實例。
與@Port的使用基本一致,實現的原理也是一樣的。
附錄1
生成的WxAuthorViewModels.kt文件:
//kotlin 擴展方法,在Activity/Fragment中通過by調用 fun ViewModelStoreOwner.lazyWxAuthorViewModel(): Lazy<WxAuthorViewModel> =LazyWeChatAuthorViewModel(this)//包級方法,在Activity/Fragment的onCreate方法之后調用 fun get(owner: ViewModelStoreOwner): WxAuthorViewModel {val factory = WxAuthorViewModelFactory()return ViewModelProvider(owner, factory).get(WxAuthorViewModel::class.java) }private class WxAuthorViewModelFactory : ViewModelProvider.Factory {@Suppress("UNCHECKED_CAST")override fun <VM : ViewModel> create(clazz: Class<VM>): VM = WxAuthorViewModel() as VM }private class LazyWxAuthorViewModel(private val owner: ViewModelStoreOwner ) : Lazy<WxAuthorViewModel> {private var _value: WxAuthorViewModel? = nulloverride val value: WxAuthorViewModelget() {if(_value == null) {_value = get(owner)}return _value!!}override fun isInitialized(): Boolean = _value != null } 復制代碼附錄2
反編譯后的WxAuthorViewModel.class:
class WxAuthorViewModel extends ViewModel {private final WxAuthorRepo wxAuthorRepo = new WxAuthorRepo();} 復制代碼附錄3
反編譯后的WxAuthorRepo.class:
class WxAuthorRepo {private final WxAuthorApi wxAuthorApi = RuntimeKt.getRetrofit().create(WxAuthorApi.class);public final WxAuthorApi getWxAuthorApi() {...return wxAuthorApi;}} 復制代碼附錄4
WxAuthorApi添加@Port注解后的WxAuthorRepo.class:
class WxAuthorRepo {private final WxAuthorApi wxAuthorApi = newRetrofit(RuntimeKt.getRetrofit(), 1080, null).create(WxAuthorApi.class);public final WxAuthorApi getWxAuthorApi() {...return wxAuthorApi;}private final Retrofit newRetrofit(Retrofit retrofit, int port, String url) {if (port > 0) {HttpUrl httpUrl = retrofit.baseUrl().newBuilder().port(port).build();return retrofit.newBuilder().baseUrl(httpUrl).build();} else if(url != null && url.length() != 0) {return retrofit.newBuilder().baseUrl(url).build();}return retrofit;}} 復制代碼總結
通過反編譯class后的代碼以及整篇文章后可以得出一個大概的結論:brick就是在java編譯成class后,class編譯成dex之前,對class的字節碼進行修改,給@Inject標記的字段賦值,實現的注入框架。 目前對ViewModel的注入還需要手動調用生成的方法來初始化,這在編譯代碼之前,AS上都會有紅色的錯誤標記,接下來,讓@Inject支持ViewModel的創建就是主要工作啦,等完成后,再發文章吧。## 寫在最后
我意識到有很多經驗和知識值得分享給大家,也可以通過我們的能力和經驗解答大家在IT學習中的很多困惑,所以在工作繁忙的情況下還是堅持各種整理和分享。但苦于知識傳播途徑有限,很多程序員朋友無法獲得正確的資料得到學習提升,故此將并將重要的Android進階資料包括自定義view、性能優化、MVC與MVP與MVVM三大框架的區別、NDK技術、阿里面試題精編匯總、常見源碼分析等學習資料免費分享出來。
知識不體系?這里還有整理出來的Android進階學習的思維腦圖,給大家參考一個方向。包含知識脈絡 + 諸多細節,由于篇幅有限,下面只是以圖片的形式給大家展示一部分。
【Android學習PDF+學習視頻+面試文檔+知識點筆記】
【Android高級架構視頻學習資源】
Android部分精講視頻領取學習后更加是如虎添翼!進軍BATJ大廠等(備戰)!現在都說互聯網寒冬,其實無非就是你上錯了車,且穿的少(技能),要是你上對車,自身技術能力夠強,公司換掉的代價大,怎么可能會被裁掉,都是淘汰末端的業務Curd而已!現如今市場上初級程序員泛濫,這套教程針對Android開發工程師1-6年的人員、正處于瓶頸期,想要年后突破自己漲薪的,進階Android中高級、架構師對你更是如魚得水,趕快領取吧!
【Android進階學習視頻】、【全套Android面試秘籍】可以簡信我【學習】查看免費領取方式!
總結
以上是生活随笔為你收集整理的android mvvm框架搭建_轻松搭建基于JetPack组件的MVVM框架的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pycharm快速添加函数及参数注释_后
- 下一篇: “鸿蒙智行”来袭