Factofy
CallAdapter的Factory有三個(gè)方法套鹅,其中有兩個(gè)是輔助用的方法绎橘,getParameterUpperBound(int, ParameterizedType)是獲取泛型的撒璧,getRawType(Type)是獲取原始類型的页屠。主要是get(Type, Annotation[], Retrofit)方法希停,這是一個(gè)抽象方法仅乓,用于創(chuàng)建CallAdapter。
get方法的參數(shù)Type和Annotation[]分別對應(yīng)定義的api方法的返回值Type和方法的注解巢寡,下圖比較清晰喉脖。
圖中可以看出returnType對應(yīng)LiveData<LoginInfo>,而annotations則對應(yīng)POST和FormUrlEncoded抑月。
但是returnType直接獲取到的不是LiveData树叽,上一篇文章就說到Type的幾個(gè)子接口類,這里就要用到了谦絮。
先調(diào)用輔助方法getRawType(returnType)题诵,取得原始類型洁仗,判斷是否是LiveData.class,不是的話返回null性锭,這樣retrofit就會循環(huán)下一個(gè)Factory赠潦,直到返回值不為空的CallAdapter。
如果原始類型是LiveData.class篷店,則判斷是否是ParameterizedType祭椰,否則拋出異常。通過getParameterUpperBound(0, (ParameterizedType) returnType)獲取泛型Type responseType疲陕,最后將這個(gè)responseType作為參數(shù)傳給CallAdapter。
PS:這里使用getRawType(responseType)的話钉赁,得到的原始類型會是LoginInfo蹄殃。
具體代碼詳見下圖:從上面可知,get方法可以理解為判斷是否是對應(yīng)的CallAdapter和取得必要參數(shù)的方法你踩。而且還可以通過在定義的api方法(如:login)那里添加注解來做一些特殊操作诅岩。
CallAdapter
CallAdapter有兩個(gè)方法,Type responseType()的返回值可以從Factory那里傳過來带膜,如上述的responseType吩谦;T adapt(Call<R> call)方法則是訪問接口獲取數(shù)據(jù)且返回對應(yīng)的類型(如:接口返回的數(shù)據(jù)是LoginInfo類型,但是定義的是LiveData<LoginInfo>類型膝藕,這里就需要處理)式廷。
這里繼續(xù)以上面的LiveData<LoginInfo>為例,可以在adapt方法創(chuàng)建一個(gè)LiveData且作為返回值返回芭挽。
然后通過call訪問接口獲取數(shù)據(jù)滑废,將返回來的數(shù)據(jù)通過livaData.postValue()通知到外部,這樣就完成了獲取數(shù)據(jù)且關(guān)聯(lián)了生命周期袜爪。
如下圖:整體使用
先上圖:上圖所示蠕趁,創(chuàng)建LoginService調(diào)用login方法,因?yàn)榉祷氐氖?strong>LiveData所以使用起來跟普通的一樣就好了辛馆,設(shè)置Observer俺陋,在onChanged方法回調(diào)更新數(shù)據(jù)。