日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android mvvm框架搭建_轻松搭建基于JetPack组件的MVVM框架

發布時間:2024/9/19 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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工程中,不用擔心體積增大的問題。

適用范圍

  • 使用androidx而非support庫。
  • 使用JetPack的ViewModel組件。
  • 使用Retrofit作為網絡請求庫。
  • 使用ROOM數據庫框架。(可選)
  • 服務端為多端口、多IP的項目。(可選)
  • 引入

  • 在你的android工程的根目錄下的build.gradle文件中的適當的位置添加以下代碼:
  • buildscript {...ext {brick_version = '0.2.0'}repositories {...maven { url 'https://jitpack.io' }}dependencies {classpath "com.gitee.numeron.brick:plugin:$brick_version"} }allprojects {repositories {...maven { url 'https://jitpack.io' }} } 復制代碼
  • 在你的android工程中要啟用brick的android模塊的build.gradle文件中的適當位置添加以下代碼:
  • ... apply plugin: 'kotlin-kapt' apply plugin: 'brick' ... dependencies {...implementation "com.gitee.numeron.brick:annotation:$brick_version"kapt "com.gitee.numeron.brick:compiler:$brick_version" } 復制代碼

    使用

    一、 @Provide注解的使用方法:

  • 在你編寫好的ViewModel子類上添加@Provide注解
  • @Provide class WxAuthorViewModel: ViewModel() {... } 復制代碼
  • 有3種方式讓brick注解處理器開始工作:
    • 在Terminal終端上輸入gradlew :[ModuleName]:kaptDebugKotlin運行腳本;
    • 在AndroidStudio右側Gradle擴展欄中依次找到[PrjectName] -> [ModuneName] -> Tasks -> other -> kaptDebugKotlin并雙擊運行腳本;
    • Ctrl + F9編譯整個項目。以上三種方式任選其一即可運行brick注解處理器。
  • 腳本運行結束后,會生成兩個包級方法:
    • lazyWxAuthorViewModel()擴展方法,在Activity或Fragment中直接調用即可。
    • get()方法,在不方便使用lazy方法時,可使用此方法獲取ViewModel的實例。注:lazyWxAuthorViewModel方法就是對get()方法的包裝。
      直接使用生成的方法,即可創建對應的ViewModel實例:
    private val wxAuthorViewModel by lazyWxAuthorViewModel() 復制代碼

    或在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中,也可以是包級屬性/方法。

  • 假設已有Retrofit Api接口和WxAuthorRepo類
  • interface WxAuthorApi {@GET("wxarticle/chapters/json ")suspend fun getWxAuthorList(): List<WxAuthor> }class WxAuthorRepo {... }復制代碼
  • 在WxAuthorRepo中添加lateinit var修飾的WxAuthorApi字段,并用@Inject標記:
  • class WxAuthorRepo {@Injectlateinit var wxAuthorApi: WxAuthorApi} 復制代碼
  • 在ViewModel中創建lateinit var修飾的WxAuthorRepo字段,并用@Inject標記:
  • @Provide class WxAuthorViewModel: ViewModel() {@Injectprivate lateinit var wxAuthorRepo: WxAuthorRepo } 復制代碼

    標記后,繼續編寫業務代碼即可,所有被@Inject標記的字段,都會在編譯期自動獲取或創建實例,無需擔心它們在何時被賦值。注:雖然是lateinit var修飾的字段,但是不要嘗試為它們賦值,這會導致致命的錯誤。注:@Inject可以注入的類型只有Retrofit的api接口和ROOM的dao接口、以及有無參構造的類。

    三、 多服務器或多端口的處理方法:

    假設有另一個Retrofit api接口,它的訪問地址或端口與baseUrl中的不一樣,此時,可以在Retrofit的api接口上添加@Port和@Url注解來設置它們的url或port。

  • @Port的使用:
  • @Port(1080) interface ArticleApi {@GET("wxarticle/list/{chapterId}/{page}/json")suspend fun getArticleList(@Path("chapterId") chapterId: Int, @Path("page") page: Int): Paged<Article>} 復制代碼

    添加此注解后,brick會在編譯期根據@RetrofitInstance注解標記的Retrofit實例和@Port的端口號,重新創建一個Retrofit實例,并使用新的Retrofit實例創建ArticleApi的實例。

  • @Url的使用:
  • @Url("http://www.wanandroid.com:1080/") interface ArticleApi {@GET("wxarticle/list/{chapterId}/{page}/json")suspend fun getArticleList(@Path("chapterId") chapterId: Int, @Path("page") page: Int): Paged<Article> } 復制代碼

    與@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框架的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 久久久久麻豆 | 国产精品一区三区 | 午夜影视av | 亚洲尤物视频 | 欧美在线一区二区三区 | 香蕉视频亚洲一级 | 国产激情无码一区二区 | 亚洲经典久久 | av巨作| 无码免费一区二区三区免费播放 | 在线va视频 | 精品中文字幕在线 | 国产精品不卡一区二区三区 | 亚洲av成人一区二区国产精品 | 亚洲国产一区在线 | 成人av一区二区三区在线观看 | 丁香六月啪啪 | 成人羞羞在线观看网站 | 精品不卡一区二区三区 | 欧美亚洲色综久久精品国产 | 在线看黄免费 | 苍井空张开腿实干12次 | 国产熟女一区二区丰满 | 少妇在军营h文高辣 | 无码精品国产一区二区三区 | 久久av秘一区二区三区 | 亚洲一区精品视频 | 午夜一区二区三区在线观看 | 91美女高潮出水 | 亚洲乱熟| 精品久久中文字幕 | www.日批| 毛片a片免费观看 | 成人熟女一区二区 | 人妻少妇精品一区二区 | www.久久网 | 日韩中文视频 | 农村妇女精品一区二区 | 少妇厨房愉情理伦bd在线观看 | 色女人网站 | 91看片就是不一样 | 欧美在线另类 | 色吧久久 | 老司机综合网 | 国产羞羞| 中文字幕精品视频在线观看 | 神马三级我不卡 | 中文字幕第一页亚洲 | 国产日产亚洲系列最新 | 侵犯女教师一区二区三区 | 成人做爰www免费看视频网站 | 淫岳高潮记小说 | 中文在线a√在线8 | 天天做天天爱天天操 | 男人天堂资源 | 国产一区二区波多野结衣 | 欧美精品乱码久久久久久按摩 | 波多野吉衣一二三区乱码 | 亚洲一区二区自偷自拍 | 国产精品99在线观看 | 久久久精品影视 | 主播一区二区 | 欧洲人妻丰满av无码久久不卡 | 国产第一页屁屁影院 | 国产一区二区在线视频 | www.色网站 | 欧美日韩啪啪 | 精品乱码一区二区三四区视频 | 黄色免费国产 | 亚洲大尺度在线观看 | 成人宗合网 | 免费亚洲网站 | 国产特黄毛片 | 高潮毛片又色又爽免费 | 在线黄视频 | 九色porny自拍视频在线播放 | 69色堂 | 国产午夜精品一区二区三区 | 91插视频 | 日韩色资源| 上海贵妇尝试黑人洋吊 | eeuss鲁丝片一区二区三区 | 欧美三级小说 | 国产伦子伦对白视频 | 人人人超碰| 北条麻妃在线一区二区 | 巨物撞击尤物少妇呻吟 | h视频亚洲| 爱看av在线 | 欧洲亚洲天堂 | 精品国产欧美一区二区三区成人 | 黄色av网站免费看 | 人妻一区二区三区免费 | 久草免费福利视频 | 黄色录像片子 | 亚洲精品久久久中文字幕痴女 | 日本美女a级片 | 欧美做受喷浆在线观看 | 天天操天天干天天舔 |