package Ġdev . ro bo code . tank roy ale . gui . util Ċ Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠUsed Ġfor Ġdefining Ġan Ġevent Ġhandler . ĠThe Ġthread Ġhandler Ġis Ġthread - safe Ġand Ġuses Ġa ĠWeak HashMap Ġto Ġget Ġrid Ġof Ġevent Ċ Ġ* Ġhandlers Ġwhen Ġtheir Ġowners Ġthat Ġare Ġbeing Ġgarbage Ġcollected . Ċ Ġ* Ċ Ġ* ĠUsage : Ċ Ġ* Ġ``` Ċ Ġ* Ġ// ĠDeclare Ġevent Ċ Ġ* Ġval Ġon My Event Ġ= ĠEvent < My Event >() Ċ Ġ* Ċ Ġ* Ġ// ĠSubscribe Ġto Ġevent Ġwith Ġan Ġevent Ġhandler Ġto Ġhandle Ġevent Ġwhen Ġit Ġoccurs Ċ Ġ* Ġon My Event . subscribe ( this ) Ġ{ Ġevent Ġ-> Ġhandle ( event ) Ġ} Ċ Ġ* Ċ Ġ* Ġ// ĠFire Ġevent Ġto Ġsubscribers Ċ Ġ* Ġon My Event . fire ( My Event ) Ċ Ġ* Ċ Ġ* Ġ// ĠRemove Ġevent Ġsubscriber Ġto Ġstop Ġreceiving Ġevents Ċ Ġ* Ġon My Event . remove ( this ) Ċ Ġ* Ġ``` Ċ Ġ*/ Ċ open Ġclass ĠEvent < T > Ġ{ ĊĊĠĠĠ Ġ// ĠA Ġsynchronized Ġmap Ġcontaining Ġweak Ġreferences Ġto Ġevent Ġhandlers . ĠThe Ġkeys Ġare Ġevent Ġsubscribers . ĊĠĠĠ Ġ// ĠWhen Ġan Ġowner Ġto Ġan Ġevent Ġhandler Ġis Ġbeing Ġgarbage Ġcollected Ġ( weak - references Ġare Ġalways ĠGC ed ), ĊĠĠĠ Ġ// Ġthe Ġhandler Ġand Ġits Ġowner Ġare Ġautomatically Ġbeing Ġremoved Ġfrom Ġthe Ġmap . ĊĠĠĠ Ġprivate Ġval Ġevent Handlers Ġ= ĠCollections . synchronized Map ( Weak HashMap < Any , ĠHandler < T >> ()) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSubscribe Ġto Ġan Ġevent Ġand Ġprovide Ġan Ġevent Ġhandler Ġfor Ġhandling Ġthe Ġevent . ĊĠĠĠĠ Ġ* Ġ@ param Ġowner Ġis Ġthe Ġowner Ġof Ġthe Ġevent Ġhandler , Ġtypically Ġ` this ` Ġinstance . ĊĠĠĠĠ Ġ* Ġ@ param Ġonce Ġis Ġa Ġflag Ġindication Ġif Ġthe Ġowner Ġshould Ġautomatically Ġbe Ġun subscribed Ġwhen Ġreceiving Ġan Ġevent . ĊĠĠĠĠ Ġ* Ġ@ param Ġevent Handler Ġis Ġthe Ġevent Ġhandler Ġfor Ġhandling Ġthe Ġevent . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsubscribe ( owner : ĠAny , Ġonce : ĠBoolean Ġ= Ġfalse , Ġevent Handler : Ġ( T ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġevent Handlers [ owner ] Ġ= ĠHandler ( event Handler , Ġonce ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUn sub scri bes Ġan Ġevent Ġhandler Ġfor Ġa Ġspecific Ġowner Ġto Ġavoid Ġreceiving Ġand Ġhandling Ġfuture Ġevents . ĊĠĠĠĠ Ġ* Ġ@ param Ġowner Ġis Ġthe Ġowner Ġof Ġthe Ġevent Ġhandler , Ġtypically Ġ` this ` Ġinstance . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġunsubscribe ( owner : ĠAny ) Ġ{ ĊĠĠĠĠĠĠĠ Ġevent Handlers . remove ( owner ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠF ires Ġan Ġevent . ĊĠĠĠĠ Ġ* Ġ@ param Ġevent Ġis Ġthe Ġsource Ġevent Ġinstance Ġfor Ġthe Ġevent Ġhandlers . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġfire ( event : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠWork Ġon Ġa Ġcopy Ġto Ġprevent ĠConcurrent Modification Exception , Ġeven Ġwhen Ġusing Ġsynchronized Map () ĊĠĠĠĠĠĠĠ Ġevent Handlers . entries . toSet (). forEach Ġ{ Ġ( owner , Ġhandler ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( once ) Ġunsubscribe ( owner ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent Handler . invoke ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEn queues Ġa Ġtask Ġon Ġthe ĠEvent ĠQueue Ġthat Ġmust Ġbe Ġinvoked Ġlater . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠExample Ġof Ġusage : ĊĠĠĠĠ Ġ* Ġ``` ĊĠĠĠĠ Ġ* Ġon Event . enqueue Ġ{ Ġmy Dialog . isVisible Ġ= Ġtrue Ġ} ĊĠĠĠĠ Ġ* Ġ``` ĊĠĠĠĠ Ġ* Ġ@ param Ġowner Ġis Ġthe Ġowner Ġof Ġthe Ġevent Ġhandler , Ġtypically Ġ` this ` Ġinstance . ĊĠĠĠĠ Ġ* Ġ@ param Ġrunnable Ġis Ġused Ġfor Ġproviding Ġthe Ġevent Ġhandler Ġfunction . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġenqueue ( owner : ĠAny , Ġrunnable : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsubscribe ( owner ) Ġ{ ĠGui Task . enqueue Ġ{ Ġrunnable . invoke () Ġ} Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠHandler < T >( ĊĠĠĠĠĠĠĠ Ġval Ġevent Handler : Ġ( T ) Ġ-> ĠUnit , ĊĠĠĠĠĠĠĠ Ġval Ġonce : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġ) Ċ }