對項目的基本介紹
- 1.整個框架主要是給MVVM框架使用的,自己寫完interface接口后,通過自定義的注解就能自動生成接口方法
- 2.用Kotlin的Flow去代替RxJAVA,因為我發現RxJava功能很強大,但是大家都只是在Http層面使用了一下,既然要用Kotlin里面就已經有Flow,那我還不如少添加一個庫
- 3.通過jetpack的Room數據庫實現網絡請求的存儲,緩存策略也用過注解去完成。
- 4.發起的網絡請求是與宿主生命周期綁定的,在網絡請求回來之前,宿主已經銷毀的話,網絡請求也會中斷的
基本使用方法
1.先定義接口類
和Retrofit一樣,需要定義一個接口類
其中@AutoApi,@AutoFlowApi,@NetStrategy是自定義的注解,后面會介紹到。
2.要先編譯,會在你的接口類的文件夾下生成一個xxxRepository.class
這是通過注解自動生成的文件,使用了kotlinpoet 并且這里apiService就是通過Retrofit拿到的接口代理
3.在viewmodel拿到對應Repository類的方法
4.在對應地方通過viewmodel調用
調用接口,傳入對應參數
在合適的地方觀察
Retrofit的封裝
上面說到在Repository類的apiService就是通過Retrofit拿到的接口代理類。 所以先進去看看apiService好了
可以看到apiService是BaseRepository的變量 而我們生成的Repository都是繼承BaseRepository的
當我們調ConfigRepository類中的方法時候,就會將ConfigRepository傳入findNeedType
而findNeedType方法就會將ConfigRepository對應的ConfigService得到并且返回出去
所以apiService就相當于這樣,好像有點Retrofit的create方法的樣子了
var apiService: T = HttpProvider.defaultCreate(ConfigService) as Class<out T>)
我們繼續進入
HttpProvider.defaultCreate
可以看到newRetrofit(),并且傳入了一個HttpConfig,看到這個名字就知道這是Http的配置 接著是newCreate(),接收了我們的接口service類
首先看看newRetrofit方法
這幾行代碼就是創建了一個Retrofit對象并且保存起來,最后返回出去。 但是他是怎么和HttpConfig聯系起來的呢?
我們可以看到這里將生成的Retrofit.Builder()傳給了HttpConfig的方法build里,我們進去看一看
可以看到這里就是我們再熟悉不過的Retrofit的配置環節
所以通過newRetrofit方法,我們就將Retrofit對象配置好并且拿到Retrofit對象,還保存起來方便下次復用
在看看newCreate()方法
這是個擴展函數,是Retrofit的擴展函數 將傳入的ConfigService通過Retrofit.create()生成代理類,并且保存起來復用
注解的介紹
1.AutoApi
我們從最簡單的AutoApi做引子,開始介紹整個注解框架
只要你的接口類方法中使用了這個注解,就會生成suspend方法,非常的簡單 接著我們來看看他是怎么實現的
看一下這個注解是怎么定義的
注解是支持有默認值的,因為kotlin的方法是可以在變量中直接賦初值的,這樣調用就不用傳值了,所以這里也做一個支持,讓調用時候更加簡潔
生成流程
代碼的分析
這里還是用ConfigService來分析
- 1.首先流程圖,我們會遍歷出使用這個注解的類,此時我們就已經拿到了ConfigService這個元素的所有信息了。
- 2.接著我們會對ConfigService將包裝起來,將他存在RepositoryClass類中。
RepositoryClass這個類會保存ConfigService的類名,包名,類型和所有方法等
- 3.會將ConfigService里的方法包裝成AutoMethod(不同的注解會有不同的類型),存入RepositoryClass的method變量中
通過上述操作后,repositoryMap就存在所有使用過AutoAPi注解的類了,再將他做遍歷,傳入Repository類的生成器RepositoryClassBuilder
這個如果不添加startFuncBuild方法的話,這段代碼就只會生成
open class ConfigRepository : BaseRepository<ConfigService>() {
}
再來看看startFunBuild,根據你當前類中的方法使用的注解去選擇對應的方法處理器
所有的方法處理器都是繼承AbsFuncBuilder的 而子類需要對方法內的具體內容做輸出,也可以在方法參數上做添加
AbsFuncBuilder類只會生成如下代碼,他會將前面RepositoryMethod收集的信息做一個輸出。但是具體內容還是交由子類去輸出的,因為每個注解對應輸出的方法體是不一樣的
suspend fun config2(page: String = "GS"): List<String> {
// 具體內容是由子類完成的
}
2.NetStrategy注解
這個注解可以傳4個參數 strategy 是緩存策略,effectiveTime是緩存時間,timeUnit是時間單位。
緩存策略默認是添加在方法上的,有時候同一個接口可能會因為不同場景而使用不同的緩存策略。
- 比如在剛進入主頁時,使用頁面初始化CacheFirst
- 頁面初始化后,再次下拉加載數據,使用NetCache
- 在當前主頁上拉加載,使用NetOnly
此時一個接口會分別使用三個不同的緩存策略
所以用isNeedAddParameter來判斷,需不需要在方法參數中添加緩存策略的參數
代碼的分析
NetStrategy的收集必須放在注解處理器的最后面,因為我展示想不到有什么好辦法可以知道,NetStrategy這個注解,是與哪個方法注解捆綁使用了。
所以必須在前面的注解收集完畢后,當我再次收集使用過NetStrategy注解的方法時,拿到方法名,再與repositoryMap中儲存的類的方法名做比較,如果一致,則表示該方法使用了NetStrategy注解,需要做緩存
3.AutoFlowApi注解介紹
使用注解生成的代碼
下面分析一下生成方法的各個方法
viewModelScopeCoroutine
一個與viewmodel生命周期綁定的協程,默認在主線程運行
這里不好解釋,我直接畫圖了
CoroutineDataFetcher { apiService.getData() }.startFetchData()
apiService.getData() 就是發起網絡請求,看一下CoroutineDataFetcher
startFetchData(),就是根據傳入的緩存參數,去找到對應的緩存策略發起Http請求的方法,很簡單看一看就好
代碼的分析
通過上面分析我們可以知道,你新寫一個注解,其實就只需要編寫兩個類就好了
- 一個繼承 RepositoryMethod 的參數收集器
- 一個繼承 AbsFuncBuilder 的方法具體內容輸出器
所以我們直接看到AutoFlowApi的這兩個類
AutoFlowMethod
可以說和 AtoMethod 一模一樣了,都是收集默認參數 不一樣的地方就是下面的一些配置
通過重寫 AbsFuncBuilder 的暴露出來的配置方法,去修改方法的配置信息,比如圖中的
- isNullable,方法返回值能否為null
- isNeedSuspend,方法是否是需要suspend關鍵字
- isNeedReturnType,方法是否需要返回值
AutoFlowApiFuncBuilder
這個是AutoFlowApi注解最關鍵的方法了,里面代碼比較多,但是也沒什么好解釋的,就是對kotlinpoet的使用,比較繁瑣且無聊。
就是將你要生成的語句寫出來,然后變量用規定字符代替
接著就是生成句子,將語句里面的規定字符,用你的變量去替代就好了
結尾
其實這個框架寫的時候沒考慮其全面性和兼容性,就打算先寫出來試一試。其實還有很多地方可以修改和擴展。
今天的文章就到這里,感謝您的閱讀,有問題可以在評論區留言探討,期待與大家共同進步。喜歡的話不要忘了三連。大家的支持和認可,是我分享的最大動力。