package Ġcom . h udson . wan android . data . repository . base Ċ Ċ import Ġandroid . util . Log Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġcom . google . gson . Gson Ċ import Ġcom . h udson . wan android . data . common . App Executor Ċ import Ġcom . h udson . wan android . data . common . merge call . Call Ċ import Ġcom . h udson . wan android . data . common . merge call . Ret rofit Call Ċ import Ġcom . h udson . wan android . data . db . Data Wrapper Dao Ċ import Ġcom . h udson . wan android . data . entity . wrapper . Data Wrapper Ċ import Ġcom . h udson . wan android . data . repository . data wrapper expire . Data Expire Config Ċ import Ġjava . lang . reflect . Parameterized Type Ċ Ċ /** Ċ Ġ* Ġfor Ġjson Ġobject Ġdata Ġentity Ċ Ġ* ĠCreated Ġby ĠH udson Ġon Ġ 2 0 2 0 / 7 / 1 4 . Ċ Ġ*/ Ċ abstract Ġclass ĠBase Network Bound Resource < Result Type , ĠRequest Type >( ĊĠĠĠ Ġprotected Ġval Ġdata Wrapper Dao : ĠData Wrapper Dao , ĊĠĠĠ Ġapp Executor : ĠApp Executor Ċ ) Ġ: ĠNetwork Bound Resource < Result Type , ĠRequest Type >( false , Ġapp Executor ){ ĊĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġprotected Ġvar Ġis Expired Ġ= Ġfalse ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġload () Ġ// è°ĥçĶ¨ çĪ¶ ç±» åĪĿå§ĭåĮĸ æĵįä½ľ ï¼Į ä¸įèĥ½ åľ¨ çĪ¶ ç±» çĽ´æİ¥ ä½¿çĶ¨ ï¼Į åĽłä¸º data Wrapper Dao åľ¨ çĪ¶ ç±» ä¸Ń è¿ĺ æ²¡æľī åĪĿå§ĭåĮĸ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ä½ł å¿ħé¡» éĩįæĸ° ä¿®æĶ¹ è§ĦåĪĻ ï¼Į åĲ¦åĪĻ å°Ĩ é»ĺè®¤ ä¸įä¼ļ ä»İ ç½ĳç»ľ èİ·åıĸ æķ°æį® ï¼Į åĽłä¸º é»ĺè®¤ æĺ¯ ä½¿çĶ¨ is Expired ï¼Ī false ï¼ī ä½ľä¸º æłĩè¯Ĩ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġshould Fetch ( data : ĠResult Type ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġis Expired ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsave Call Result ( item : ĠRequest Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclazz Ġ= Ġget Request Class () ĊĠĠĠĠĠĠĠ Ġsave Data Wrapper ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclazz , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitem , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Wrapper Dao , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġidentity Info () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġget Request Class (): ĠClass < RequestType >{ ĊĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġjava Class . generic Super class Ġas ĠParameter ized Type ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġreturn Ġtype . actual Type Arguments [ 1 ] Ġas ĠClass < RequestType > ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġload From Db (): ĠLive Data < Result Type > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmutable LiveData Ġ= ĠMutable LiveData < Result Type >() ĊĠĠĠĠĠĠĠ Ġapp Executor . io Executor . execute { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// æķ°æį®åºĵ è®¿éĹ® ï¼Į å¼ĤæŃ¥ å¤ĦçĲĨ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclazz Ġ= Ġget Request Class () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwrapper Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Data Wrapper ( clazz , Ġdata Wrapper Dao , Ġidentity Info ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Data Expire ( wrapper ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource Ġ= Ġwrapper ?. content ?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjson Entity Ġ= ĠGson (). fromJson ( this , Ġclazz ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransform ( json Entity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmutable LiveData . post Value ( source ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġmutable LiveData ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġcheck Data Expire ( data Wrapper : ĠData Wrapper ? ){ ĊĠĠĠĠĠĠĠ Ġif ( is Data Wrapper Expire ( data Wrapper )){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( java Class . simple Name ," data Ġis Ġexpired , Ġtype : Ġ"+ Ġdata Wrapper ?. content ?. java Class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Expired Ġ= Ġtrue Ġ// Ġexpire Ġtag ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġfun Ġtransform ( request Type : ĠRequest Type ): ĠResult Type ? ĊĊĠĠĠ Ġ// åĮº åĪĨ åĲĮ ä¸Ģ ç±» æķ°æį®çļĦ é¢Ŀ å¤ĸ æłĩè¯Ĩ ĊĠĠĠ Ġopen Ġfun Ġidentity Info () Ġ= Ġ"" Ċ } ĊĊĊĊ Ċ fun Ġis Data Wrapper Expire ( data Wrapper : ĠData Wrapper ?): ĠBoolean { ĊĠĠĠ Ġreturn Ġif ( data Wrapper Ġ== Ġnull ){ ĊĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠ Ġreturn Ġdata Wrapper . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ġ!= Ġnull Ġ&& Ġexpire Time Ġ!= Ġ 0 L Ġ&& ĠSystem . currentTimeMillis () Ġ>= Ġexpire Time ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġload Data Wrapper ( clazz : ĠClass <* >, data Wrapper Dao : ĠData Wrapper Dao , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġidentity Info : ĠString ): ĠData Wrapper ? Ġ{ ĊĠĠĠ Ġreturn Ġdata Wrapper Dao . query Exactly ( clazz . name , Ġidentity Info ) Ċ } Ċ Ċ fun Ġ< T > Ġconvert Type OrNull ( input : ĠAny ?): ĠT ? { ĊĠĠĠ Ġreturn Ġif ( input Ġ== Ġnull ) Ġnull Ġelse Ġinput Ġas ĠT Ċ } Ċ Ċ fun Ġ< T > Ġwrapper Call ( call : Ġretrofit 2 . Call < T >): ĠCall < T > Ġ{ ĊĠĠĠ Ġreturn ĠRet rofit Call ( call ) Ċ } Ċ Ċ fun Ġ< T > Ġsave Data Wrapper ( clazz : ĠClass <* >, Ġcontent : ĠT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Wrapper Dao : ĠData Wrapper Dao , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġidentity Info : ĠString ){ ĊĠĠĠ Ġval Ġdata Wrapper Ġ= ĊĠĠĠĠĠĠĠ ĠData Wrapper ( clazz ) ĊĠĠĠ Ġdata Wrapper . custom Info Ġ= Ġidentity Info ĊĠĠĠ Ġdata Wrapper . content Ġ= ĠGson (). toJson ( content ) ĊĊĠĠĠ Ġval Ġage Ġ= ĠData Expire Config . get Age ( clazz ) ĊĠĠĠ Ġif ( age Ġ!= Ġ 0 L ){ Ġ// Ġif Ġwe Ġneed Ġmanage Ġdata Ġage ĊĠĠĠĠĠĠĠ Ġdata Wrapper . expire Time Ġ= ĠSystem . currentTimeMillis () Ġ+ Ġage ĊĠĠĠ Ġ} ĊĠĠĠ Ġdata Wrapper Dao . insert ( data Wrapper ) Ċ }