日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

對項目的基本介紹

  • 1.整個框架主要是給MVVM框架使用的,自己寫完interface接口后,通過自定義的注解就能自動生成接口方法
  • 2.用Kotlin的Flow去代替RxJAVA,因為我發現RxJava功能很強大,但是大家都只是在Http層面使用了一下,既然要用Kotlin里面就已經有Flow,那我還不如少添加一個庫
  • 3.通過jetpack的Room數據庫實現網絡請求的存儲,緩存策略也用過注解去完成。
  • 4.發起的網絡請求是與宿主生命周期綁定的,在網絡請求回來之前,宿主已經銷毀的話,網絡請求也會中斷的

基本使用方法

1.先定義接口類

和Retrofit一樣,需要定義一個接口類

其中@AutoApi,@AutoFlowApi,@NetStrategy是自定義的注解,后面會介紹到。

Android開發:使用Kotlin+協程+自定義注解+Retrofit的網絡框架

 

2.要先編譯,會在你的接口類的文件夾下生成一個xxxRepository.class

這是通過注解自動生成的文件,使用了kotlinpoet 并且這里apiService就是通過Retrofit拿到的接口代理

Android開發:使用Kotlin+協程+自定義注解+Retrofit的網絡框架

 

3.在viewmodel拿到對應Repository類的方法

Android開發:使用Kotlin+協程+自定義注解+Retrofit的網絡框架

 

4.在對應地方通過viewmodel調用

調用接口,傳入對應參數

Android開發:使用Kotlin+協程+自定義注解+Retrofit的網絡框架

 

在合適的地方觀察

Android開發:使用Kotlin+協程+自定義注解+Retrofit的網絡框架

 

Retrofit的封裝

上面說到在Repository類的apiService就是通過Retrofit拿到的接口代理類。 所以先進去看看apiService好了

可以看到apiService是BaseRepository的變量 而我們生成的Repository都是繼承BaseRepository的

Android開發:使用Kotlin+協程+自定義注解+Retrofit的網絡框架

 

當我們調ConfigRepository類中的方法時候,就會將ConfigRepository傳入findNeedType

Android開發:使用Kotlin+協程+自定義注解+Retrofit的網絡框架

 

而findNeedType方法就會將ConfigRepository對應的ConfigService得到并且返回出去

Android開發:使用Kotlin+協程+自定義注解+Retrofit的網絡框架

 

所以apiService就相當于這樣,好像有點Retrofit的create方法的樣子了

var apiService: T = HttpProvider.defaultCreate(ConfigService) as Class<out T>)

我們繼續進入
HttpProvider.defaultCreate

可以看到newRetrofit(),并且傳入了一個HttpConfig,看到這個名字就知道這是Http的配置 接著是newCreate(),接收了我們的接口service類

Android開發:使用Kotlin+協程+自定義注解+Retrofit的網絡框架

 

首先看看newRetrofit方法

這幾行代碼就是創建了一個Retrofit對象并且保存起來,最后返回出去。 但是他是怎么和HttpConfig聯系起來的呢?

Android開發:使用Kotlin+協程+自定義注解+Retrofit的網絡框架

 

我們可以看到這里將生成的Retrofit.Builder()傳給了HttpConfig的方法build里,我們進去看一看

Android開發:使用Kotlin+協程+自定義注解+Retrofit的網絡框架

 

可以看到這里就是我們再熟悉不過的Retrofit的配置環節

Android開發:使用Kotlin+協程+自定義注解+Retrofit的網絡框架

 

所以通過newRetrofit方法,我們就將Retrofit對象配置好并且拿到Retrofit對象,還保存起來方便下次復用

在看看newCreate()方法

這是個擴展函數,是Retrofit的擴展函數 將傳入的ConfigService通過Retrofit.create()生成代理類,并且保存起來復用

Android開發:使用Kotlin+協程+自定義注解+Retrofit的網絡框架

 

注解的介紹

1.AutoApi

我們從最簡單的AutoApi做引子,開始介紹整個注解框架

只要你的接口類方法中使用了這個注解,就會生成suspend方法,非常的簡單 接著我們來看看他是怎么實現的

Android開發:使用Kotlin+協程+自定義注解+Retrofit的網絡框架

 


Android開發:使用Kotlin+協程+自定義注解+Retrofit的網絡框架

 

看一下這個注解是怎么定義的

注解是支持有默認值的,因為kotlin的方法是可以在變量中直接賦初值的,這樣調用就不用傳值了,所以這里也做一個支持,讓調用時候更加簡潔

Android開發:使用Kotlin+協程+自定義注解+Retrofit的網絡框架

 

生成流程

Android開發:使用Kotlin+協程+自定義注解+Retrofit的網絡框架

 

代碼的分析

這里還是用ConfigService來分析

Android開發:使用Kotlin+協程+自定義注解+Retrofit的網絡框架

 

  • 1.首先流程圖,我們會遍歷出使用這個注解的類,此時我們就已經拿到了ConfigService這個元素的所有信息了。
  • 2.接著我們會對ConfigService將包裝起來,將他存在RepositoryClass類中。

RepositoryClass這個類會保存ConfigService的類名,包名,類型和所有方法等

Android開發:使用Kotlin+協程+自定義注解+Retrofit的網絡框架

 

  • 3.會將ConfigService里的方法包裝成AutoMethod(不同的注解會有不同的類型),存入RepositoryClass的method變量中
Android開發:使用Kotlin+協程+自定義注解+Retrofit的網絡框架

 


Android開發:使用Kotlin+協程+自定義注解+Retrofit的網絡框架

 

通過上述操作后,repositoryMap就存在所有使用過AutoAPi注解的類了,再將他做遍歷,傳入Repository類的生成器RepositoryClassBuilder

Android開發:使用Kotlin+協程+自定義注解+Retrofit的網絡框架

 

這個如果不添加startFuncBuild方法的話,這段代碼就只會生成

open class ConfigRepository : BaseRepository<ConfigService>() {
      
}

Android開發:使用Kotlin+協程+自定義注解+Retrofit的網絡框架

 

再來看看startFunBuild,根據你當前類中的方法使用的注解去選擇對應的方法處理器

Android開發:使用Kotlin+協程+自定義注解+Retrofit的網絡框架

 

所有的方法處理器都是繼承AbsFuncBuilder的 而子類需要對方法內的具體內容做輸出,也可以在方法參數上做添加

Android開發:使用Kotlin+協程+自定義注解+Retrofit的網絡框架

 

AbsFuncBuilder類只會生成如下代碼,他會將前面RepositoryMethod收集的信息做一個輸出。但是具體內容還是交由子類去輸出的,因為每個注解對應輸出的方法體是不一樣的

suspend fun config2(page: String = "GS"): List<String> {
        // 具體內容是由子類完成的
}

2.NetStrategy注解

這個注解可以傳4個參數 strategy 是緩存策略,effectiveTime是緩存時間,timeUnit是時間單位。

緩存策略默認是添加在方法上的,有時候同一個接口可能會因為不同場景而使用不同的緩存策略。

  • 比如在剛進入主頁時,使用頁面初始化CacheFirst
  • 頁面初始化后,再次下拉加載數據,使用NetCache
  • 在當前主頁上拉加載,使用NetOnly

此時一個接口會分別使用三個不同的緩存策略

所以用isNeedAddParameter來判斷,需不需要在方法參數中添加緩存策略的參數

Android開發:使用Kotlin+協程+自定義注解+Retrofit的網絡框架

 

代碼的分析

NetStrategy的收集必須放在注解處理器的最后面,因為我展示想不到有什么好辦法可以知道,NetStrategy這個注解,是與哪個方法注解捆綁使用了。

所以必須在前面的注解收集完畢后,當我再次收集使用過NetStrategy注解的方法時,拿到方法名,再與repositoryMap中儲存的類的方法名做比較,如果一致,則表示該方法使用了NetStrategy注解,需要做緩存

Android開發:使用Kotlin+協程+自定義注解+Retrofit的網絡框架

 

3.AutoFlowApi注解介紹

使用注解生成的代碼

下面分析一下生成方法的各個方法

Android開發:使用Kotlin+協程+自定義注解+Retrofit的網絡框架

 

viewModelScopeCoroutine

一個與viewmodel生命周期綁定的協程,默認在主線程運行

Android開發:使用Kotlin+協程+自定義注解+Retrofit的網絡框架

 


Android開發:使用Kotlin+協程+自定義注解+Retrofit的網絡框架

 

這里不好解釋,我直接畫圖了

Android開發:使用Kotlin+協程+自定義注解+Retrofit的網絡框架

 

CoroutineDataFetcher { apiService.getData() }.startFetchData()

apiService.getData() 就是發起網絡請求,看一下CoroutineDataFetcher

Android開發:使用Kotlin+協程+自定義注解+Retrofit的網絡框架

 

startFetchData(),就是根據傳入的緩存參數,去找到對應的緩存策略發起Http請求的方法,很簡單看一看就好

Android開發:使用Kotlin+協程+自定義注解+Retrofit的網絡框架

 

代碼的分析

通過上面分析我們可以知道,你新寫一個注解,其實就只需要編寫兩個類就好了

  • 一個繼承 RepositoryMethod 的參數收集器
  • 一個繼承 AbsFuncBuilder 的方法具體內容輸出器

所以我們直接看到AutoFlowApi的這兩個類

AutoFlowMethod

可以說和 AtoMethod 一模一樣了,都是收集默認參數 不一樣的地方就是下面的一些配置

Android開發:使用Kotlin+協程+自定義注解+Retrofit的網絡框架

 

通過重寫 AbsFuncBuilder 的暴露出來的配置方法,去修改方法的配置信息,比如圖中的

  • isNullable,方法返回值能否為null
  • isNeedSuspend,方法是否是需要suspend關鍵字
  • isNeedReturnType,方法是否需要返回值
Android開發:使用Kotlin+協程+自定義注解+Retrofit的網絡框架

 

AutoFlowApiFuncBuilder

這個是AutoFlowApi注解最關鍵的方法了,里面代碼比較多,但是也沒什么好解釋的,就是對kotlinpoet的使用,比較繁瑣且無聊。

就是將你要生成的語句寫出來,然后變量用規定字符代替

Android開發:使用Kotlin+協程+自定義注解+Retrofit的網絡框架

 

接著就是生成句子,將語句里面的規定字符,用你的變量去替代就好了

Android開發:使用Kotlin+協程+自定義注解+Retrofit的網絡框架

 

結尾

其實這個框架寫的時候沒考慮其全面性和兼容性,就打算先寫出來試一試。其實還有很多地方可以修改和擴展。

今天的文章就到這里,感謝您的閱讀,有問題可以在評論區留言探討,期待與大家共同進步。喜歡的話不要忘了三連。大家的支持和認可,是我分享的最大動力。

分享到:
標簽:開發 Android
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定