package Ġcom . sd . lib . stream . factory Ċ Ċ import Ġandroid . util . Log Ċ import Ġcom . sd . lib . stream . F Stream Ċ import Ġcom . sd . lib . stream . F Stream Manager Ċ import Ġcom . sd . lib . stream . factory . Default Stream Factory . Create Param Ċ import Ġjava . lang . ref . Reference Queue Ċ import Ġjava . lang . ref . Weak Reference Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠçĶ¨ å¼± å¼ķçĶ¨ ç¼ĵåŃĺ æµģ å¯¹è±¡çļĦ å·¥ åİĤ Ċ Ġ*/ Ċ class ĠWeak Cache Stream Factory Ġ: ĠCache able Stream Factory () Ġ{ ĊĠĠĠ Ġprivate Ġval Ġ_ reference Queue Ġ= ĠReference Queue < F Stream >() ĊĊĠĠĠ Ġprivate Ġval Ġ_ map Stream : ĠMutable Map < Class < out ĠF Stream >, ĠWeak Reference < F Stream >> Ġ= ĠHashMap () ĊĠĠĠ Ġprivate Ġval Ġ_ map Reference : ĠMutable Map < Weak Reference < F Stream >, ĠClass < out ĠF Stream >> Ġ= ĠHashMap () ĊĊĠĠĠ Ġoverride Ġfun Ġget Cache ( param : ĠCreate Param ): ĠF Stream ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġreference Ġ= Ġ_ map Stream [ param . class Stream ] ĊĠĠĠĠĠĠĠ Ġreturn Ġreference ?. get () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Cache ( param : ĠCreate Param , Ġstream : ĠF Stream ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrelease Reference () ĊĊĠĠĠĠĠĠĠ Ġval Ġreference Ġ= ĠWeak Reference ( stream , Ġ_ reference Queue ) ĊĠĠĠĠĠĠĠ Ġval Ġold Reference Ġ= Ġ_ map Stream . put ( param . class Stream , Ġreference ) ĊĠĠĠĠĠĠĠ Ġif Ġ( old Reference Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ ç§»éĻ¤ æĹ§ çļĦ å¼ķçĶ¨ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ map Reference . remove ( old Reference ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( F Stream Manager . isDebug ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWeak Cache Stream Factory :: class . java . simple Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" remove Ġold Ġreference :${ old Reference } Ġ${ _ size Log }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ_ map Reference [ reference ] Ġ= Ġparam . class Stream ĊĠĠĠĠĠĠĠ Ġif Ġ( F Stream Manager . isDebug ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWeak Cache Stream Factory :: class . java . simple Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ++++ + Ġset Cache Ġfor Ġclass :${ param . class Stream . name } Ġstream :${ stream } Ġreference :${ reference } Ġ${ _ size Log }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrelease Reference () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcount Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreference Ġ= Ġ_ reference Queue . poll () Ġ?: Ġbreak ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclazz Ġ= Ġ_ map Reference . remove ( reference ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( clazz Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġå¦Ĥæŀľ ä¸º null ï¼Į è¯´æĺİ è¿Ļä¸ª å¼ķçĶ¨ å·²ç»ı è¢« æīĭåĬ¨ ä»İ map ä¸Ń ç§»éĻ¤ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( F Stream Manager . isDebug ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWeak Cache Stream Factory :: class . java . simple Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" release Reference Ġghost Ġreference Ġwas Ġfound :${ reference }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstream Reference Ġ= Ġ_ map Stream . remove ( clazz ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( stream Reference Ġ=== Ġreference ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( F Stream Manager . isDebug ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWeak Cache Stream Factory :: class . java . simple Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" release Reference Ġclass :${ clazz . name } Ġreference :${ reference } Ġstream Reference :${ stream Reference }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( count Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( F Stream Manager . isDebug ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWeak Cache Stream Factory :: class . java . simple Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" release Reference Ġcount :${ count } Ġ${ _ size Log }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġ_ size Log : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsize :${ _ map Stream . size }, ${ _ map Reference . size } ĊĠĠĠĠĠĠĠ Ġ""" . trim Indent () Ċ }