package Ġw ang . lifecycle Ċ Ċ import Ġandroidx . arch . core . internal . Safe Iterable Map Ċ import Ġandroidx . lifecycle .* Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġw ang . lifecycle . internal .* Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠBackground Live Event Ġis Ġa Ġevent Ġholder Ġclass Ġfor Ġobserve Ġevent Ġon Ġbackground Ġthread , Ġthat Ċ Ġ* Ġcan Ġbe Ġobserved Ġwithin Ġa Ġgiven Ġlifecycle . Ċ Ġ* Ċ Ġ* ĠUse Ġthis Ġ[ Background Observer ] Ġif Ġyou Ġwant Ġuse Ġthe Ġspecified Ġthread Ġto Ġreceive Ġevents . Ċ Ġ* ĠExample : Ċ Ġ* Ġ``` Ċ Ġ* Ġ// Ġ 1 . Ġcustom Ġa ĠEvent Dispatcher Ċ Ġ* Ġclass ĠCustom EventDispatcher Ġ: ĠEvent Dispatcher Ġ{ Ċ Ġ* ĠĠĠĠĠ Ġ// Ġcustom Ġa Ġthread Ġexecutor Ċ Ġ* ĠĠĠĠĠ Ġprivate Ġval Ġthread Executor Ġ= ĠExec utors . new Single Thread Executor () Ċ Ġ* ĠĠĠĠĠ Ġoverride Ġfun Ġdispatch ( run nable : ĠRunnable ) Ġ{ Ċ Ġ* ĠĠĠĠĠĠĠĠĠ Ġ// Ġwill Ġnotify Ġa Ġevent Ġby Ġthe Ġthread Executor Ċ Ġ* ĠĠĠĠĠĠĠĠĠ Ġthread Executor . execute ( run nable ) Ċ Ġ* ĠĠĠĠĠ Ġ} Ċ Ġ* Ġ} Ċ Ġ* Ċ Ġ* Ġ// Ġ 2 . Ġuse ĠBackground Observer Ġto Ġobserve Ċ Ġ* Ġbackground Live Event . observe ( owner , Ġobject Ġ: ĠBackground Observer < Int >( custom EventDispatcher ){ Ċ Ġ* ĠĠĠĠĠ Ġoverride Ġfun ĠonChanged ( event : ĠT ) Ġ{ Ċ Ġ* ĠĠĠĠĠĠĠĠĠ Ġ// Ġreceive Ġevent Ġin Ġspecified Ġthread Ġof Ġthe Ġcustom EventDispatcher . Ċ Ġ* ĠĠĠĠĠ Ġ} Ċ Ġ* Ġ} Ċ Ġ* Ġ``` Ċ Ġ* Ċ Ġ* ĠNote Ġcustom Ġdispatcher Ġof ĠBackground Observer Ġtakes Ġprecedence Ġover Ġglobal Ġdispatcher . Ċ Ġ* Ċ Ġ* ĠIf Ġyou Ġneed Ġobserve Ġevent Ġon Ġmain Ġthread , Ġyou Ġcan Ġuse Ġ[ Live Event ]. Ċ Ġ* Ċ Ġ* Ġ@ param ĠT ĠThe Ġtype Ġof Ġdata Ġhold Ġby Ġthis Ġinstance . Ċ Ġ*/ Ċ open Ġclass ĠBackground Live Event < T > Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġinternal Ġconst Ġval ĠTHREAD _ NAME _ DEFAULT _ SCHEDUL ER Ġ= Ġ" default - dispatcher " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSTART _ VERSION Ġ= ĠInternal Supported LiveData . START _ VERSION ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠNOT _ SET Ġ= ĠInternal Supported LiveData . NOT _ SET ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġs Default Scheduler Ġ= ĠInternal Dispatcher ( THREAD _ NAME _ DEFAULT _ SCHEDUL ER ) ĠĠĠ Ġ// Ġlike Ġmain Ġthread , Ġit Ġis Ġthe Ġonly . ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġs Background Lifecycle Bridge Ġ= ĠBackground Lifecycle Bridge ( s Default Scheduler ) ĊĠĠĠĠĠĠĠ Ġinternal Ġval ĠLifecycle Owner . background Lifecycle Ġ: ĠLifecycle ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġs Background Lifecycle Bridge . get Background Lifecycle ( this ) Ġ?: Ġthrow ĠRuntimeException (" Un K now !") ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġtry Attach Background Lifecycle ( owner : ĠLifecycle Owner ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs Background Lifecycle Bridge . try Attach Background Lifecycle ( owner ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġm Pending Data Lock Ġ= ĠAny () ĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġprivate Ġvar Ġm Data : ĠAny ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġm Observer s : ĠSafe Iterable Map < Observer < in ĠT >, ĠObserver Wrapper > Ġ= ĠSafe Iterable Map () ĊĠĠĠ Ġprivate Ġvar Ġm Active Count Ġ= Ġ 0 ĊĠĠĠ Ġ// Ġwhen ĠsetData Ġis Ġcalled , Ġwe Ġset Ġthe Ġpending Ġdata Ġand Ġactual Ġdata Ġswap Ġhappens Ġon Ġthe ĊĠĠĠ Ġ// Ġdispatch Pip ĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġprivate Ġvar Ġm Pending Data : ĠAny ? Ġ= ĠNOT _ SET ĊĠĠĠ Ġprivate Ġvar Ġm Version : ĠInt ĊĠĠĠ Ġprivate Ġvar Ġm Dispatch ing Value Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġm Dispatch Invalid ated Ġ= Ġfalse ĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġprivate Ġvar Ġm Lost Pending Value Head Ġ: ĠL ost Value . Head < T >? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġm Thread Value Map Ġby Ġlazy Ġ{ ĠThread Value Map () Ġ} ĊĠĠĠ Ġprivate Ġvar Ġno Loss Observer Count Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġval Ġhas No Loss Observer ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġno Loss Observer Count Ġ> Ġ 0 ĊĠĠĠ Ġprivate Ġval Ġm Post Value Runnable Ġ= Ġobject Ġ: ĠInternal Runnable Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar ĠnewValue : ĠAny ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( m Pending Data Lock ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠnewValue Ġ= Ġm Pending Data ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Pending Data Ġ= ĠNOT _ SET ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Lost Pending Value () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsetValue ( newValue Ġas ĠT ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreates Ġa ĠBackground Live Event Ġinitialized Ġwith Ġthe Ġgiven Ġ[ value ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ property Ġvalue Ġinitial Ġvalue . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġconstructor ( value : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Data Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġm Version Ġ= ĠSTART _ VERSION Ġ+ Ġ 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreates Ġa ĠBackground Live Event Ġwith Ġno Ġvalue Ġassigned Ġto Ġit . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġconstructor () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Data Ġ= ĠNOT _ SET ĊĠĠĠĠĠĠĠ Ġm Version Ġ= ĠSTART _ VERSION ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconsider Notify ( observer : ĠObserver Wrapper ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! observer . m Active ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġlatest Ġstate Ġb 4 Ġdispatch . ĠMaybe Ġit Ġchanged Ġstate Ġbut Ġwe Ġdidn 't Ġget Ġthe Ġevent Ġyet . ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// Ġwe Ġstill Ġfirst Ġcheck Ġobserver . active Ġto Ġkeep Ġit Ġas Ġthe Ġentr ance Ġfor Ġevents . ĠSo Ġeven Ġif ĊĠĠĠĠĠĠĠ Ġ// Ġthe Ġobserver Ġmoved Ġto Ġan Ġactive Ġstate , Ġif Ġwe 've Ġnot Ġreceived Ġthat Ġevent , Ġwe Ġbetter Ġnot ĊĠĠĠĠĠĠĠ Ġ// Ġnotify Ġfor Ġa Ġmore Ġpredict able Ġnotification Ġorder . ĊĠĠĠĠĠĠĠ Ġif Ġ(! observer . shouldBe Active ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobserver . active StateChanged ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( observer . m Last Version Ġ>= Ġm Version ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġobserver . m Last Version Ġ= Ġm Version ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġm Data Ġas ĠT ĊĠĠĠĠĠĠĠ ĠonChanged For Observer ( observer . m Observer , Ġdata ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdispatch ing Value ( init iator : ĠObserver Wrapper ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Dispatch ing Value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Dispatch Invalid ated Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġm Dispatch ing Value Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġvar Ġinit iator 1 Ġ= Ġinit iator ĊĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Dispatch Invalid ated Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( init iator 1 Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsider Notify ( init iator 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit iator 1 Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" IN ACC ES SI BLE _ TYPE ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġiterator : ĠIterator < Map . Entry < Observer < in ĠT >, ĠObserver Wrapper >> Ġ= Ġm Observer s . iterator With Add itions () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( iterator . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsider Notify ( iterator . next (). value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Dispatch Invalid ated ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( m Dispatch Invalid ated ) ĊĠĠĠĠĠĠĠ Ġm Dispatch ing Value Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠonChanged For Observer ( observer : ĠObserver < in ĠT >, Ġvalue : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( observer Ġis ĠBackground Observer ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdispatcher Ġ= Ġobserver . dispatcher ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdispatcher . dispatch ( object Ġ: ĠInternal Runnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobserver . on Changed ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs Default Scheduler . dispatch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobserver . on Changed ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Lifecycle Owner Destroy For Observer Box ( observer : ĠObserver < in ĠT >) Ġ{ ĊĠĠĠĠĠĠĠ Ġremove Observer ( observer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdetach No Sticky Observer ( observer : ĠNo Sticky Observer Box < T >) Ġ{ ĊĠĠĠĠĠĠĠ Ġobserver . detach Observer () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdetach No Loss Value Observer ( observer : ĠNo Loss Observer Box < T >) Ġ{ ĊĠĠĠĠĠĠĠ Ġno Loss Observer Count -- ĊĠĠĠĠĠĠĠ Ġobserver . detach Observer () ĊĠĠĠĠĠĠĠ Ġobserver . active StateChanged ( false ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrecord Lost Pending Value ( pending Data : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġhead Ġ= Ġthis . m Lost Pending Value Head ĊĠĠĠĠĠĠĠ Ġif Ġ( head Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhead Ġ= ĠL ost Value . Head ( pending Data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . m Lost Pending Value Head Ġ= Ġhead ĊĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhead . append Tail ( pending Data ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnotify Lost Pending Value () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhead : ĠL ost Value . Head < T > Ġ= Ġthis . m Lost Pending Value Head Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġm Lost Pending Value Head Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġm Observer s . each Observer Box Ġ{ Ġobserver Box Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( observer Box Ġis ĠNo Loss Observer Box ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhead . each To Tail ( block Ġ= Ġobserver Box :: on Changed ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconsider Notify For No Loss Observer () Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" IN ACC ES SI BLE _ TYPE ") ĊĠĠĠĠĠĠĠ Ġval Ġiterator Ġ= Ġm Observer s . iterator With Add itions () Ġas ĠIterator < Map . Entry < Observer < in ĠT >, ĠObserver Wrapper >> ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( iterator . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Ġ= Ġiterator . next () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġobserver Wrapper Ġ= Ġentry . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġobserver Ġ= Ġentry . key ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( observer Ġis ĠObserver Box ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( observer Ġis ĠNo Loss Observer Box ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsider Notify ( observer Wrapper ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobserver Ġ= Ġobserver . observer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdds Ġthe Ġgiven Ġobserver Ġto Ġthe Ġob servers Ġlist Ġwithin Ġthe Ġl if es pan Ġof Ġthe Ġgiven Ġowner . ĊĠĠĠĠ Ġ* ĠThe Ġevents Ġare Ġdis patched Ġon Ġbackground Ġthread . ĠIf ĠBackground Live Event Ġalready Ġhas ĊĠĠĠĠ Ġ* Ġdata Ġset , Ġit Ġwill Ġbe Ġdelivered Ġto Ġthe Ġobserver . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġobserver Ġwill Ġonly Ġreceive Ġevents Ġif Ġthe Ġowner Ġis Ġin Ġ[ Lifecycle . State . STARTED ] ĊĠĠĠĠ Ġ* Ġor Ġ[ Lifecycle . State . RE SU MED ] Ġstate Ġ( active ). ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġthe Ġowner Ġmoves Ġto Ġthe Ġ[ Lifecycle . State . DESTROY ED ] Ġstate , Ġthe Ġobserver Ġwill ĊĠĠĠĠ Ġ* Ġautomatically Ġbe Ġremoved . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠWhen Ġdata Ġchanges Ġwhile Ġthe Ġ[ owner ] Ġis Ġnot Ġactive , Ġit Ġwill Ġnot Ġreceive Ġany Ġupdates . ĊĠĠĠĠ Ġ* ĠIf Ġit Ġbecomes Ġactive Ġagain , Ġit Ġwill Ġreceive Ġthe Ġlast Ġavailable Ġdata Ġautomatically . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠBackground Live Event Ġkeeps Ġa Ġstrong Ġreference Ġto Ġthe Ġobserver Ġand Ġthe Ġowner Ġas Ġlong ĊĠĠĠĠ Ġ* Ġas Ġthe Ġgiven ĠLifecycle Owner Ġis Ġnot Ġdestroyed . ĠWhen Ġit Ġis Ġdestroyed , ĠBackground Live Event ĊĠĠĠĠ Ġ* Ġremoves Ġreferences Ġto Ġthe Ġobserver Ġ& Ġthe Ġ[ owner ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġthe Ġgiven Ġowner Ġis Ġalready Ġin Ġ[ Lifecycle . State . DESTROY ED ] Ġstate , ĠBackground Live Event ĊĠĠĠĠ Ġ* Ġignores Ġthe Ġcall . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġthe Ġgiven Ġowner , Ġobserver Ġtuple Ġis Ġalready Ġin Ġthe Ġlist , Ġthe Ġcall Ġis Ġignored . ĊĠĠĠĠ Ġ* ĠIf Ġthe Ġobserver Ġis Ġalready Ġin Ġthe Ġlist Ġwith Ġanother Ġowner , ĠBackground Live Event Ġthrows Ġan ĊĠĠĠĠ Ġ* Ġ[ IllegalArgumentException ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġowner ĠĠĠ ĠThe ĠLifecycle Owner Ġwhich Ġcontrols Ġthe Ġobserver ĊĠĠĠĠ Ġ* Ġ@ param Ġobserver ĠThe Ġobserver Ġthat Ġwill Ġreceive Ġthe Ġevents ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġobserve ( owner : ĠLifecycle Owner , Ġobserver : ĠObserver < in ĠT >) Ġ{ ĊĠĠĠĠĠĠĠ Ġobserve Inner ( owner , Ġobserver ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġobserve Inner ( ĊĠĠĠĠĠĠĠ Ġowner : ĠLifecycle Owner , Ġobserver : ĠObserver < in ĠT >, ĊĠĠĠĠĠĠĠ Ġon After : Ġ(( Lifecycle Bound Observer ) Ġ-> ĠUnit )? Ġ= Ġnull ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( owner . lifecycle . currentState Ġ== ĠLifecycle . State . DESTROY ED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġignore ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtry Attach Background Lifecycle ( owner ) ĊĊĠĠĠĠĠĠĠ Ġs Default Scheduler . dispatch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( owner . lifecycle . currentState Ġ== ĠLifecycle . State . DESTROY ED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġignore ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ dispatch ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwrapper Ġ= ĠLifecycle Bound Observer ( owner , Ġobserver ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexisting : ĠObserver Wrapper ? Ġ= Ġm Observer s . put If Absent ( observer , Ġwrapper ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire (!( existing Ġ!= Ġnull Ġ&& Ġ! existing . is Attached To ( owner ))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Cannot Ġadd Ġthe Ġsame Ġobserver Ġwith Ġdifferent Ġl ifec yc les " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( existing Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ dispatch ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġowner . background Lifecycle . add Observer ( wrapper ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon After ?. invoke ( wrapper ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdds Ġthe Ġgiven Ġobserver Ġto Ġthe Ġob servers Ġlist . ĠThis Ġcall Ġis Ġsimilar Ġto Ġ[ observe ] ĊĠĠĠĠ Ġ* Ġwith Ġa ĠLifecycle Owner , Ġwhich Ġis Ġalways Ġactive . ĠThis Ġmeans Ġthat Ġthe Ġgiven Ġobserver ĊĠĠĠĠ Ġ* Ġwill Ġreceive Ġcalling Ġ[ setValue ] Ġall Ġevents Ġand Ġwill Ġnever Ġbe Ġautomatically Ġremoved . ĊĠĠĠĠ Ġ* ĠYou Ġshould Ġmanually Ġcall Ġ[ remove Observer ] Ġto Ġstop Ġob serving Ġthis ĠBackground Live Event . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠWhile ĠBackground Live Event Ġhas Ġone Ġof Ġsuch Ġob servers , Ġit Ġwill Ġbe Ġconsidered ĊĠĠĠĠ Ġ* Ġas Ġactive . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġthe Ġobserver Ġwas Ġalready Ġadded Ġwith Ġan Ġowner Ġto Ġthis ĠBackground Live Event , ĊĠĠĠĠ Ġ* ĠBackground Live Event Ġthrows Ġan Ġ[ IllegalArgumentException ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġobserver ĠThe Ġobserver Ġthat Ġwill Ġreceive Ġthe Ġevents ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġobserve Fore ver ( observer : ĠObserver < in ĠT >) Ġ{ ĊĠĠĠĠĠĠĠ Ġobserve Fore ver Inner ( observer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġobserve Fore ver Inner ( observer : ĠObserver < in ĠT >) Ġ{ ĊĠĠĠĠĠĠĠ Ġs Default Scheduler . dispatch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġno Loss Observer Count ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwrapper Ġ= ĠAlways Active Observer ( observer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexisting Ġ= Ġm Observer s . put If Absent ( observer , Ġwrapper ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( existing Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ dispatch ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrapper . active StateChanged ( true ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ[ observe ] Ġis Ġa Ġsticky Ġfunction , Ġthis Ġfunction Ġis Ġto Ġshield Ġthe Ġsticky . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ see Ġobserve ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġobserve No Sticky ( owner : ĠLifecycle Owner , Ġobserver : ĠObserver < in ĠT >) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( owner . lifecycle . currentState Ġ== ĠLifecycle . State . DESTROY ED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġignore ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtry Attach Background Lifecycle ( owner ) ĊĊĠĠĠĠĠĠĠ Ġs Default Scheduler . dispatch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( owner . lifecycle . currentState Ġ== ĠLifecycle . State . DESTROY ED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġignore ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ dispatch ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Observer s . each Observer Box { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( observer Ġ=== Ġit . observer ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( it Ġis ĠNo Sticky Observer Box ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Cannot Ġadd Ġthe Ġsame Ġobserver Ġwith Ġdifferent Ġfuture " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( it . is Attached To ( owner )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Cannot Ġadd Ġthe Ġsame Ġobserver Ġwith Ġdifferent Ġl ifec yc les " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ dispatch ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( m Version Ġ== ĠSTART _ VERSION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġno Sticky Observer Ġ= ĠLifecycle Bound No Sticky Observer Box ( owner , Ġobserver , Ġfalse , Ġ:: on Changed For Observer , Ġ:: on Lifecycle Owner Destroy For Observer Box , Ġis Background Ġ= Ġtrue ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġowner . background Lifecycle . add Observer ( no Sticky Observer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobserve Inner ( owner , Ġno Sticky Observer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ dispatch ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( owner . lifecycle . currentState . is At Least ( Lifecycle . State . STARTED )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġno Sticky Observer Ġ= ĠLifecycle Bound No Sticky Observer Box ( owner , Ġobserver , Ġtrue , Ġ:: on Changed For Observer , Ġ:: on Lifecycle Owner Destroy For Observer Box , Ġis Background Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġowner . background Lifecycle . add Observer ( no Sticky Observer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobserve Inner ( owner , Ġno Sticky Observer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġno Sticky Observer Ġ= ĠLifecycle Bound No Sticky Observer Box ( owner , Ġobserver , Ġfalse , Ġ:: on Changed For Observer , Ġ:: on Lifecycle Owner Destroy For Observer Box , Ġis Background Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġowner . background Lifecycle . add Observer ( no Sticky Observer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobserve Inner ( owner , Ġno Sticky Observer ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . m Last Version Ġ= Ġm Version ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ[ observe Fore ver ] Ġis Ġa Ġsticky Ġfunction , Ġthis Ġfunction Ġis Ġto Ġshield Ġthe Ġsticky . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠYou Ġshould Ġmanually Ġcall Ġ[ remove Observer ] Ġto Ġstop Ġob serving Ġthis Ġ[ Background Live Event ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ see Ġobserve Fore ver ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġobserve Fore ver No Sticky ( observer : ĠObserver < in ĠT >) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġs Default Scheduler . dispatch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Observer s . each Observer Box Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( observer Ġ=== Ġit . observer ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( it Ġis ĠNo Sticky Observer Box ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Cannot Ġadd Ġthe Ġsame Ġobserver Ġwith Ġdifferent Ġfuture " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( it Ġis ĠAlways Active ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Cannot Ġadd Ġthe Ġsame Ġobserver Ġwith Ġdifferent Ġl ifec yc les " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ dispatch ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Version Ġ== ĠSTART _ VERSION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġno Sticky Observer Ġ= ĠAlways Active No Sticky Observer Box ( observer , Ġfalse , Ġ:: on Changed For Observer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobserve Fore ver Inner ( no Sticky Observer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ dispatch ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġno Sticky Observer Ġ= ĠAlways Active No Sticky Observer Box ( observer , Ġtrue , Ġ:: on Changed For Observer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobserve Fore ver Inner ( no Sticky Observer ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUsing Ġthis Ġfunction Ġmeans Ġcalling Ġ[ setValue ] Ġand Ġ[ post Value ] Ġthat Ġno Ġloss Ġevery Ġevent ĊĠĠĠĠ Ġ* Ġfor Ġthe Ġ[ observer ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ* ĠIf Ġthe Ġ[ owner ] Ġbe Ġactive , Ġwill Ġrecord Ġpending Ġdata Ġwhen Ġcall Ġ[ post Value ], Ġuntil Ġnext Ġtime ĊĠĠĠĠ Ġ* Ġ[ setValue ] Ġis Ġcalled , Ġall Ġrecorded Ġdata Ġwill Ġbe Ġnotified Ġto Ġthe Ġ[ observer ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ* ĠIf Ġthe Ġ[ owner ] Ġbe Ġinactive , Ġwill Ġrecord Ġdata Ġand Ġpending Ġdata Ġwhen Ġcall Ġ[ setValue ] Ġand ĊĠĠĠĠ Ġ* Ġ[ post Value ], Ġuntil Ġowner Ġbe Ġactive , Ġall Ġrecorded Ġdata Ġwill Ġbe Ġnotified Ġto Ġthe Ġ[ observer ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ see Ġobserve ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġobserve No Loss ( owner : ĠLifecycle Owner , Ġobserver : ĠObserver < in ĠT >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( owner . lifecycle . currentState Ġ== ĠLifecycle . State . DESTROY ED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġignore ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtry Attach Background Lifecycle ( owner ) ĊĊĠĠĠĠĠĠĠ Ġs Default Scheduler . dispatch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( owner . lifecycle . currentState Ġ== ĠLifecycle . State . DESTROY ED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġignore ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ dispatch ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Observer s . each Observer Box Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( observer Ġ=== Ġit . observer ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( it Ġis ĠNo Loss Observer Box ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Cannot Ġadd Ġthe Ġsame Ġobserver Ġwith Ġdifferent Ġfuture " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( it . is Attached To ( owner )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Cannot Ġadd Ġthe Ġsame Ġobserver Ġwith Ġdifferent Ġl ifec yc les " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ dispatch ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġno Loss Value Observer Ġ= ĠAlways Active To Lifecycle Bound No Loss Observer Box ( owner , Ġobserver , Ġ:: on Changed For Observer , Ġ:: on Lifecycle Owner Destroy For Observer Box , Ġis Background Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġowner . background Lifecycle . add Observer ( no Loss Value Observer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobserve Fore ver Inner ( no Loss Value Observer ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUsing Ġthis Ġfunction Ġmeans Ġcalling Ġ[ setValue ] Ġand Ġ[ post Value ] Ġthat Ġno Ġloss Ġevery Ġevent ĊĠĠĠĠ Ġ* Ġfor Ġthe Ġ[ observer ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠYou Ġshould Ġmanually Ġcall Ġ[ remove Observer ] Ġto Ġstop Ġob serving Ġthis Ġ[ Background Live Event ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġobserve Fore ver No Loss ( observer : ĠObserver < in ĠT >) Ġ{ ĊĠĠĠĠĠĠĠ Ġs Default Scheduler . dispatch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Observer s . each Observer Box Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( observer Ġ=== Ġit . observer ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( it Ġis ĠNo Loss Observer Box ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Cannot Ġadd Ġthe Ġsame Ġobserver Ġwith Ġdifferent Ġfuture " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( it Ġis ĠAlways Active ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Cannot Ġadd Ġthe Ġsame Ġobserver Ġwith Ġdifferent Ġl ifec yc les " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ dispatch ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġno Loss Value Observer Ġ= ĠAlways Active No Loss Observer Box ( observer , Ġ:: on Changed For Observer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobserve Fore ver Inner ( no Loss Value Observer ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUsing Ġthis Ġfunction Ġmeans Ġno Ġloss Ġand Ġno Ġsticky Ġfor Ġthe Ġ[ observer ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ see Ġobserve No Loss ĊĠĠĠĠ Ġ* Ġ@ see Ġobserve No Sticky ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġobserve No Sticky No Loss ( owner : ĠLifecycle Owner , Ġobserver : ĠObserver < in ĠT >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( owner . lifecycle . currentState Ġ== ĠLifecycle . State . DESTROY ED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġignore ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtry Attach Background Lifecycle ( owner ) ĊĊĠĠĠĠĠĠĠ Ġs Default Scheduler . dispatch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( owner . lifecycle . currentState Ġ== ĠLifecycle . State . DESTROY ED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġignore ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ dispatch ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Observer s . each Observer Box Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcurrent Observer : ĠObserver < *> Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( current Observer Ġis ĠObserver Box <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Observer Ġ= Ġcurrent Observer . observer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Observer Ġ=== Ġobserver ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( it . observer Ġis ĠNo Sticky Observer Box ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Cannot Ġadd Ġthe Ġsame Ġobserver Ġwith Ġdifferent Ġfuture " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( it . is Attached To ( owner )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Cannot Ġadd Ġthe Ġsame Ġobserver Ġwith Ġdifferent Ġl ifec yc les " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( it Ġis ĠAlways Active To Lifecycle Bound No Loss Observer Box ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Cannot Ġadd Ġthe Ġsame Ġobserver Ġwith Ġdifferent Ġfuture " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ dispatch ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġshould Ignore Sticky Ġ= Ġm Version Ġ!= ĠSTART _ VERSION ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġno Sticky Observer Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLifecycle Bound No Sticky Observer Box ( owner , Ġobserver , Ġshould Ignore Sticky , Ġ:: on Changed For Observer , Ġ:: on Lifecycle Owner Destroy For Observer Box , Ġis Background Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġowner . background Lifecycle . add Observer ( no Sticky Observer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġno Loss Value Observer Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAlways Active To Lifecycle Bound No Loss Observer Box ( owner , Ġno Sticky Observer , Ġ:: on Changed For Observer , Ġ:: on Lifecycle Owner Destroy For Observer Box , Ġis Background Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġowner . background Lifecycle . add Observer ( no Loss Value Observer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobserve Fore ver Inner ( no Loss Value Observer ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUsing Ġthis Ġfunction Ġmeans Ġno Ġloss Ġand Ġno Ġsticky Ġfor Ġthe Ġ[ observer ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠYou Ġshould Ġmanually Ġcall Ġ[ remove Observer ] Ġto Ġstop Ġob serving Ġthis Ġ[ Background Live Event ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ see Ġobserve Fore ver No Sticky ĊĠĠĠĠ Ġ* Ġ@ see Ġobserve Fore ver No Loss ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġobserve Fore ver No Sticky No Loss ( observer : ĠObserver < in ĠT >) Ġ{ ĊĠĠĠĠĠĠĠ Ġs Default Scheduler . dispatch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Observer s . each Observer Box Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcurrent Observer : ĠObserver < *> Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( current Observer Ġis ĠObserver Box <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Observer Ġ= Ġcurrent Observer . observer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Observer Ġ=== Ġobserver ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( it . observer Ġis ĠNo Sticky Observer Box ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Cannot Ġadd Ġthe Ġsame Ġobserver Ġwith Ġdifferent Ġfuture " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( it Ġis ĠAlways Active ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Cannot Ġadd Ġthe Ġsame Ġobserver Ġwith Ġdifferent Ġl ifec yc les " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( it Ġis ĠAlways Active No Loss Observer Box ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Cannot Ġadd Ġthe Ġsame Ġobserver Ġwith Ġdifferent Ġfuture " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ dispatch ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġshould Ignore Sticky Ġ= Ġm Version Ġ!= ĠSTART _ VERSION ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġno Sticky Observer Ġ= ĠAlways Active No Sticky Observer Box ( observer , Ġshould Ignore Sticky , Ġ:: on Changed For Observer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġno Loss Value Observer Ġ= ĠAlways Active No Loss Observer Box ( no Sticky Observer , Ġ:: on Changed For Observer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobserve Fore ver Inner ( no Loss Value Observer ) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRemoves Ġall Ġob servers Ġthat Ġare Ġtied Ġto Ġthe Ġgiven Ġ[ Lifecycle Owner ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġowner ĠThe Ġ[ Lifecycle Owner ] Ġscope Ġfor Ġthe Ġob servers Ġto Ġbe Ġremoved . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġremove Observer s ( owner : ĠLifecycle Owner ) Ġ{ ĊĠĠĠĠĠĠĠ Ġs Default Scheduler . dispatch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Observer s . each Observer Box Ġ{ observer Box Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( observer Box . is Attached To ( owner ) Ġ&& Ġobserver Box . observer Ġ! is ĠObserver Box ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove Observer ( observer Box . observer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( key , Ġvalue ) Ġin Ġm Observer s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value . is Attached To ( owner )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove Observer ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRemoves Ġthe Ġgiven Ġobserver Ġfrom Ġthe Ġob servers Ġlist . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġobserver ĠThe ĠObserver Ġto Ġreceive Ġevents . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġremove Observer ( observer : ĠObserver < in ĠT >) Ġ{ ĊĠĠĠĠĠĠĠ Ġs Default Scheduler . dispatch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfinal Observer Ġ= Ġm Observer s . detach Observer Box With ( observer ){ Ġdetach Observer Box Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( detach Observer Box ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNo Sticky Observer Box Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdetach No Sticky Observer ( detach Observer Box Ġas ĠNo Sticky Observer Box < T >) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNo Loss Observer Box Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdetach No Loss Value Observer ( detach Observer Box Ġas ĠNo Loss Observer Box < T >) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremoved Ġ= Ġm Observer s . remove ( final Observer ) Ġ?: Ġreturn @ dispatch ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremoved . detach Observer () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremoved . active StateChanged ( false ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġtrue Ġif Ġthis ĠBackground Live Event Ġhas Ġactive Ġob servers . ĊĠĠĠĠ Ġ* ĠNote Ġthat Ġcalling Ġthis Ġmethod Ġdoes Ġnot Ġguarantee Ġthat Ġthe Ġlatest Ġvalue Ġset Ġwill Ġbe Ġreceived . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġthis ĠBackground Live Event Ġhas Ġactive Ġob servers ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġhas Active Observer s (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġm Active Count Ġ> Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġtrue Ġif Ġthis ĠBackground Live Event Ġhas Ġob servers . ĊĠĠĠĠ Ġ* ĠNote Ġthat Ġcalling Ġthis Ġmethod Ġdoes Ġnot Ġguarantee Ġthat Ġthe Ġlatest Ġvalue Ġset Ġwill Ġbe Ġreceived . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġthis ĠBackground Live Event Ġhas Ġob servers ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġhas Observer s (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġm Observer s . size () Ġ> Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPosts Ġa Ġtask Ġto Ġbackground Ġthread Ġto Ġset Ġthe Ġgiven Ġvalue . ĠSo Ġif Ġyou Ġhave Ġa Ġfollowing Ġcode ĊĠĠĠĠ Ġ* Ġexecuted Ġin Ġsame Ġthread : ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġbackground Live Event . post Value (" a "); ĊĠĠĠĠ Ġ* Ġbackground Live Event . post Value (" b "); ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġvalue Ġ" b " Ġwould Ġbe Ġset Ġat Ġfirst Ġand Ġlater Ġthe Ġbackground Ġthread Ġwould Ġoverride Ġit Ġwith ĊĠĠĠĠ Ġ* Ġthe Ġvalue Ġ" a ". ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġvalue ĠThe Ġnew Ġvalue ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġopen Ġfun Ġpost Value ( value : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġpost Task : ĠBoolean ĊĠĠĠĠĠĠĠ Ġsynchronized ( m Pending Data Lock ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Task Ġ= Ġm Pending Data Ġ=== ĠNOT _ SET ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! post Task ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġrecord Ġlast Ġpending Ġdata , Ġbecause Ġit Ġwill Ġlost . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecord Lost Pending Value ( m Pending Data Ġas ĠT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Pending Data Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! post Task ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġs Default Scheduler . dispatch ( m Post Value Runnable ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSets Ġthe Ġvalue . ĠIf Ġthere Ġare Ġactive Ġob servers , Ġthe Ġvalue Ġwill Ġbe Ġdis patched Ġto Ġthem ĊĠĠĠĠ Ġ* Ġin Ġbackground Ġthread . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġvalue ĠThe Ġnew Ġvalue ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġopen Ġfun ĠsetValue ( value : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġthread Value Ġ= Ġm Thread Value Map . setValue AndGet ( value ) ĊĠĠĠĠĠĠĠ Ġs Default Scheduler . dispatch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdispatch ing Value Ġto Ġno Loss ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has No Loss Observer Ġ&& Ġm Dispatch ing Value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsider Notify For No Loss Observer () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Version ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Data Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthread Value . remove () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch ing Value ( null ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġcurrent Ġvalue . ĊĠĠĠĠ Ġ* ĠNote Ġthat Ġcalling Ġthis Ġmethod Ġdoes Ġnot Ġguarantee Ġthat Ġthe Ġlatest Ġvalue Ġset Ġwill Ġbe Ġreceived . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġcurrent Ġvalue ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun ĠgetValue (): ĠT ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġthread Value Ġ= Ġm Thread Value Map . get () ĊĠĠĠĠĠĠĠ Ġif Ġ( thread Value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthread Value . value ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġm Data ĊĠĠĠĠĠĠĠ Ġif Ġ( data Ġ!== ĠNOT _ SET ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdata Ġas ĠT ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġon Active () Ġ{ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġon Inactive () Ġ{ Ġ} ĊĊĠĠĠ Ġprivate Ġabstract Ġinner Ġclass ĠObserver Wrapper Ġinternal Ġconstructor ( val Ġm Observer : ĠObserver < in ĠT >) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġm Active Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġm Last Version Ġ= ĠSTART _ VERSION ĊĊĠĠĠĠĠĠĠ Ġabstract Ġfun ĠshouldBe Active (): ĠBoolean ĊĊĠĠĠĠĠĠĠ Ġopen Ġfun Ġis Attached To ( owner : ĠLifecycle Owner ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġopen Ġfun Ġdetach Observer () Ġ{ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġactive StateChanged ( new Active : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Active Ġ== Ġm Active ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġimmediately Ġset Ġactive Ġstate , Ġso Ġwe Ġnot Ġdispatch Ġanything Ġto Ġinactive Ġowner Ġin Ġhere ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Active Ġ= Ġnew Active ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwas Inactive Ġ= Ġm Active Count Ġ== Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Active Count Ġ+= Ġif Ġ( m Active ) Ġ 1 Ġelse Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( was Inactive Ġ&& Ġm Active ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Active () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Active Count Ġ== Ġ 0 Ġ&& Ġ! m Active ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Inactive () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Active ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch ing Value ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠAlways Active Observer Ġconstructor ( observer : ĠObserver < in ĠT >) Ġ: ĠObserver Wrapper ( observer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠshouldBe Active (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠLifecycle Bound Observer ĊĠĠĠ Ġconstructor ( private Ġval Ġm Owner : ĠLifecycle Owner , Ġobserver : ĠObserver < in ĠT >) ĊĠĠĠĠĠĠĠ Ġ: ĠObserver Wrapper ( observer ), ĠLifecycle Event Observer Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠshouldBe Active (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġm Owner . lifecycle . currentState . is At Least ( Lifecycle . State . STARTED ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon StateChanged ( source : ĠLifecycle Owner , Ġevent : ĠLifecycle . Event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs Default Scheduler . dispatch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcurrent State Ġ= Ġm Owner . lifecycle . currentState ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( currentState Ġ== ĠLifecycle . State . DESTROY ED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove Observer ( m Observer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ dispatch ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġprev State : ĠLifecycle . State ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( prev State Ġ!= Ġcurrent State ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev State Ġ= Ġcurrent State ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactive StateChanged ( shouldBe Active ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent State Ġ= Ġm Owner . lifecycle . currentState ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġis Attached To ( owner : ĠLifecycle Owner ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġm Owner Ġ=== Ġowner ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdetach Observer () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Owner . background Lifecycle . remove Observer ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠThread Value Map Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġm Values Ġ= ĠWeak HashMap < Thread , ĠThread Value ?> () ĊĊĠĠĠĠĠĠĠ Ġfun ĠsetValue AndGet ( value : ĠT ) Ġ= ĠThread Value ( Thread . currentThread (), Ġvalue ). apply Ġ{ Ġm Values [ Thread . currentThread ()] Ġ= Ġthis Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġget (): ĠThread Value ? Ġ= Ġm Values [ Thread . currentThread ()] ĊĊĠĠĠĠĠĠĠ Ġinner Ġclass ĠThread Value ( private Ġval Ġthread : ĠThread , Ġvar Ġvalue : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġremove () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Values . remove ( thread ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġevent Ġdispatcher Ġinterface Ġfor Ġ[ Background Live Event ]. Ċ Ġ*/ Ċ interface ĠEvent Dispatcher Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġinternal Ġconst Ġval ĠTHREAD _ NAME _ BACKGROUND Ġ= Ġ" background - event - dispatcher " ĊĠĠĠĠĠĠĠ Ġval ĠBACK GROUND Ġ: ĠEvent Dispatcher Ġ= ĠInternal Dispatcher ( THREAD _ NAME _ BACKGROUND ) ĊĠĠĠĠĠĠĠ Ġval ĠAS Y NC Ġ: ĠEvent Dispatcher Ġ= ĠInternal Async Dispatcher () ĊĠĠĠĠĠĠĠ Ġval ĠMAIN Ġ: ĠEvent Dispatcher Ġ= ĠInternal Main Dispatcher () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalling Ġwhen Ġ[ Background Live Event ] Ġdispatch Ġevent . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdispatch ( run nable : ĠRunnable ) Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġsimple Ġcallback Ġthat Ġcan Ġspecified Ġthread Ġto Ġreceive Ġevent Ġfrom Ġ[ Background Live Event ]. Ċ Ġ* Ċ Ġ* Ġ@ property Ġdispatcher Ġ[ on Changed ] Ġbe Ġfinal Ġcalled Ġby Ġ[ EventDispatcher . dispatch ]. Ċ Ġ* Ġ@ param ĠT ĠThe Ġtype Ġof Ġthe Ġparameter Ċ Ġ* Ċ Ġ* Ġ@ see ĠBackground Live Event ĠBackground Live Event Ġ- Ġfor Ġa Ġusage Ġdescription . Ċ Ġ* Ġ@ see ĠEvent Dispatcher ĠĠĠĠ ĠEvent Dispatcher Ġ- Ġhas Ġdefault Ġimplementation . Ċ Ġ*/ Ċ abstract Ġclass ĠBackground Observer < T > Ġ( internal Ġval Ġdispatcher : ĠEvent Dispatcher ) Ġ: ĠObserver < T >