@ file : Suppress (" Member Visibility Can Be Private ", Ġ" unused ") Ċ Ċ package Ġdev . ent ao . kan . img loader Ċ Ċ import Ġdev . ent ao . kan . app base . App Ċ import Ġdev . ent ao . kan . app base . sql . Map Table Ċ import Ġdev . ent ao . kan . base . Sleep Ċ import Ġdev . ent ao . kan . base . ex . Multi HashMap Ċ import Ġdev . ent ao . kan . http . HttpGet Ċ import Ġdev . ent ao . kan . app base . Task Queue Ċ import Ġjava . io . File Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠCreated Ġby Ġent ao yang @ 1 6 3 . com Ġon Ġ 2 0 1 6 - 1 1 - 0 2 . Ċ Ġ*/ Ċ Ċ interface ĠDown Listener Ġ{ ĊĠĠĠ Ġfun Ġon Download ( url : ĠString , Ġok : ĠBoolean ) Ċ } Ċ Ċ object ĠFile Downloader Ġ{ ĊĠĠĠ Ġ// ä¸ĭè½½ ä¸ŃçļĦ æĸĩä»¶ ĊĠĠĠ Ġprivate Ġval Ġprocess Set Ġ= ĠHashSet < String >() ĊĊĠĠĠ Ġprivate Ġval Ġlisten Map Ġ= ĠMulti HashMap < String , ĠDown Listener >() ĊĠĠĠ Ġprivate Ġval Ġqueue Ġ= ĠTask Queue (" file downloader ") ĊĊĠĠĠ Ġfun Ġis Downloading ( url : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġurl Ġin Ġprocess Set ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdownload ( url : ĠString , Ġblock : Ġ( File ?) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġqueue . back Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdownload Sync ( url , Ġobject Ġ: ĠDown Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Download ( url : ĠString , Ġok : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġf Ġ= ĠFile Local Cache . find ( url ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock ( f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhttp Down ( url : ĠString , Ġfile : ĠFile ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( url . length Ġ< Ġ 8 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġh Ġ= ĠHttp Get ( url ) ĊĠĠĠĠĠĠĠ Ġh . timeout Connect ( 1 0 _ 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġh . timeout Read ( 1 0 _ 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġvar Ġr Ġ= Ġh . download ( file , Ġnull ) ĊĠĠĠĠĠĠĠ Ġvar Ġok Ġ= Ġr . OK Ġ&& Ġfile . exists () Ġ&& Ġfile . length () Ġ> Ġ 0 ĊĠĠĠĠĠĠĠ Ġif Ġ(! ok ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSleep ( 3 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr Ġ= ĠHttp Get ( url ). download ( file , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġok Ġ= Ġr . OK Ġ&& Ġfile . exists () Ġ&& Ġfile . length () Ġ> Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġok ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdownload Sync ( url : ĠString , Ġlistener : ĠDown Listener ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( listener Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( listen Map ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlisten Map . put ( url , Ġlistener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! process Set . add ( url )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtmp Ġ= ĠApp . files . ex . temp File () ĊĠĠĠĠĠĠĠ Ġval Ġok Ġ= Ġhttp Down ( url , Ġtmp ) ĊĠĠĠĠĠĠĠ Ġif Ġ( ok ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile Local Cache . put ( url , Ġtmp . absolute Path ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtmp . delete () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġprocess Set . remove ( url ) ĊĠĠĠĠĠĠĠ Ġqueue . fore Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġls Ġ= Ġsynchronized ( listen Map ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlisten Map . remove ( url ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ls Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( l Ġin Ġls ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl . on Download ( url , Ġok ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġret rive ( url : ĠString , Ġblock : Ġ( File ?) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġf Ġ= ĠFile Local Cache . find ( url ) ĊĠĠĠĠĠĠĠ Ġif Ġ( f Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock ( f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdownload ( url , Ġblock ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ object ĠFile Local Cache Ġ{ ĊĠĠĠ Ġ// url -> file ĊĠĠĠ Ġprivate Ġval Ġmap Ġ= ĠMap Table (" file _ downloader ") ĊĊĠĠĠ Ġ// æŁ¥æī¾ æľ¬åľ° ĊĠĠĠ Ġfun Ġfind ( url : ĠString ): ĠFile ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġf Ġ= Ġmap [ url ] Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( f ) ĊĠĠĠĠĠĠĠ Ġif Ġ( file . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfile ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmap . remove ( url ) ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove ( url : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġf Ġ= Ġmap [ url ] Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ ĠFile ( f ). delete () ĊĠĠĠĠĠĠĠ Ġmap . remove ( url ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġput ( url : ĠString , Ġpath : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmap . put ( url , Ġpath ) ĊĠĠĠ Ġ} Ċ }