package Ġcom . data . demo . other Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . View Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . lifecycle .* Ċ import Ġw ang . lifecycle . Mutable Background Live Event Ċ import Ġcom . data . demo . R Ċ import Ġkotlinx . android . synt hetic . main . activity _ specified _ thread _ observe _ event .* Ċ import Ġw ang . lifecycle . Background Observer Ċ import Ġw ang . lifecycle . EventDispatcher Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . util . concurrent . ExecutorService Ċ import Ġjava . util . concurrent . Executors Ċ import Ġjava . util . concurrent . Thread Factory ĊĊ Ċ class ĠSpec ified Thread To Ob serve Demo Activity Ġ: ĠAppCompatActivity () Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġbackground Live Event : ĠMutable Background Live Event < String > Ġ= ĊĠĠĠĠĠĠĠ ĠMutable Background Live Event () ĊĠĠĠ Ġprivate Ġvar Ġb 1 Ġ: ĠExecutor Service ?= null ĊĠĠĠ Ġprivate Ġval Ġcount Ġ= Ġ 5 ĊĠĠĠ Ġprivate Ġval Ġt 1 Ġ= ĠExec utors . new Single Thread Executor () ĊĠĠĠ Ġprivate Ġval Ġcustom EventDispatcher Ġ= ĠCustom EventDispatcher () Ġ// Ġ åįķ ä¸ª Observer æĮĩå®ļçļĦ åĪĨ åıĳ åĻ¨ ĊĠĠĠ Ġprivate Ġvar Ġbackground Open Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġval Ġbackground Runnable Ġ= ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 0 0 0 0 0 .. 5 0 0 0 0 0 ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! background Open ) Ġreturn @ Runnable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Value ("[ åĲİåı° Ġ$ i ]") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( 5 _ 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} catch Ġ( e : ĠInterruptedException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ Runnable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġobserver Ġ= Ġ ĠObserver < String >{ Ġt Ġ-> ĊĠĠĠĠĠĠĠ Ġlog (" on Changed Ġé»ĺè®¤ Ġ- Ġthread :${ Thread . currentThread (). name }", Ġt ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġobserver a Ġ= Ġ Ġobject : ĊĠĠĠĠĠĠĠ ĠBackground Observer < String >( EventDispatcher . MAIN ){ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonChanged ( t : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog (" on Changed ĠEvent Dispatcher . MAIN Ġ- Ġthread :${ Thread . currentThread (). name }", Ġt ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġobserver b Ġ= Ġ Ġobject : ĊĠĠĠĠĠĠĠ ĠBackground Observer < String >( EventDispatcher . BACKGROUND ){ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonChanged ( t : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog (" on Changed ĠEvent Dispatcher . BACKGROUND Ġ- Ġthread :${ Thread . currentThread (). name }", Ġt ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġobserver c Ġ= Ġ Ġobject : ĊĠĠĠĠĠĠĠ ĠBackground Observer < String >( EventDispatcher . ASYNC ){ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonChanged ( t : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog (" on Changed ĠEvent Dispatcher . ASYNC Ġ- Ġthread :${ Thread . currentThread (). name }", Ġt ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġobserver d Ġ= Ġobject Ġ: ĠBackground Observer < String >( custom EventDispatcher ){ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonChanged ( t : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog (" on Changed Ġcustom EventDispatcher Ġ- Ġthread :${ Thread . currentThread (). name }", Ġt ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" Click ableView Accessibility ") ĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ specified _ thread _ observe _ event ) ĊĠĠĠĠĠĠĠ Ġsupport ActionBar ?. set Display Home As Up Enabled ( true ) ĊĊĠĠĠĠĠĠĠ Ġlifecycle . add Observer ( Lifecycle Event Observer { Ġ_, event -> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog (" on StateChanged ", Ġevent . name ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĊĠĠĠĠĠĠĠ Ġlog (" setValue ", Ġ" init Ġevent ") ĊĠĠĠĠĠĠĠ ĠsetValue (" init Ġevent ") ĊĊĠĠĠĠĠĠĠ Ġinit Listener () ĊĊĠĠĠĠĠĠĠ Ġobserve . perform Click () ĊĠĠĠĠĠĠĠ Ġobserve a . perform Click () ĊĠĠĠĠĠĠĠ Ġobserve b . perform Click () ĊĠĠĠĠĠĠĠ Ġob ser vec . perform Click () ĊĠĠĠĠĠĠĠ Ġobserved . perform Click () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Listener () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfullscreen _ content . add On Layout ChangeListener ( View . On Layout ChangeListener Ġ{ Ġv , Ġleft , Ġtop , Ġright , Ġbottom , Ġold Left , Ġold Top , Ġold Right , Ġold Bottom Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn sv . smooth Scroll To ( 0 , bottom ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġbutton Clean . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfullscreen _ content . text Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġback g Open . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( background Open ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog (" fail Ġ[ å¼ĢåĲ¯ ] éĹ´ éļĶ 5 s Ġpost Value ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOnClickListener ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog ("[ å¼ĢåĲ¯ ] éĹ´ éļĶ 5 s Ġpost Value ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbackground Open Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġb 1 Ġ= ĠExec utors . new Single Thread Executor () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġb 1 ?. execute ( background Runnable ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġback g Close . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! background Open ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog (" fail Ġ[ åħ³éĹŃ ] éĹ´ éļĶ 5 s Ġpost Value ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOnClickListener ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog ("[ åħ³éĹŃ ] éĹ´ éļĶ 5 s Ġpost Value ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbackground Open Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġb 1 ?. shutdown Now () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġpost 1 . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt 1 . execute Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Value ("[ post Value ]") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġpost M . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt 1 . execute Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Value ("[ post Value ][$ i ]") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġset 1 . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt 1 . execute Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfullscreen _ content . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetValue ("[ setValue ]") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġset M . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetValue ("[ setValue ][$ i ]") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġobserve . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog (" æ·»åĬł è§Ĥ å¯Ł åĻ¨ ", Ġ" observe Ġ- Ġé»ĺè®¤ Ġ- Ġ é»ĺ åħ¨å±Ģ ç»Łä¸Ģ çļĦ åŃĲ çº¿ç¨ĭ æİ¥æĶ¶ ï¼Į ä¸į å»ºè®® åģļ èĢĹ æĹ¶ æĵįä½ľ ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbackground Live Event . observe ( this , Ġobserver ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġobserve 1 . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog (" ç§»éĻ¤ è§Ĥ å¯Ł åĻ¨ ", Ġ" observe Ġ- Ġé»ĺè®¤ Ġ- Ġ é»ĺ åħ¨å±Ģ ç»Łä¸Ģ çļĦ åŃĲ çº¿ç¨ĭ æİ¥æĶ¶ ï¼Į ä¸į å»ºè®® åģļ èĢĹ æĹ¶ æĵįä½ľ ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbackground Live Event . remove Observer ( observer ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġobserve a . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog (" æ·»åĬł è§Ĥ å¯Ł åĻ¨ ", Ġ" observe Ġ- ĠEvent Dispatcher . MAIN Ġ- Ġ ä¸» çº¿ç¨ĭ æİ¥æĶ¶ ï¼Į ä¸į å»ºè®® åģļ èĢĹ æĹ¶ æĵįä½ľ ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbackground Live Event . observe ( this , Ġobserver a ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġobserve a 1 . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog (" ç§»éĻ¤ è§Ĥ å¯Ł åĻ¨ ", Ġ" observe Ġ- ĠEvent Dispatcher . MAIN Ġ- Ġ ä¸» çº¿ç¨ĭ æİ¥æĶ¶ ï¼Į ä¸į å»ºè®® åģļ èĢĹ æĹ¶ æĵįä½ľ ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbackground Live Event . remove Observer ( observer a ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġobserve b . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog (" æ·»åĬł è§Ĥ å¯Ł åĻ¨ ", Ġ" observe Ġ- ĠEvent Dispatcher . BACKGROUND Ġ- Ġ åĲİåı° çº¿ç¨ĭ æİ¥æĶ¶ ï¼Į ä¸į å»ºè®® åģļ èĢĹ æĹ¶ æĵįä½ľ ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbackground Live Event . observe ( this , Ġobserver b ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġobserve b 1 . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog (" ç§»éĻ¤ è§Ĥ å¯Ł åĻ¨ ", Ġ" observe Ġ- ĠEvent Dispatcher . BACKGROUND Ġ- Ġ åĲİåı° çº¿ç¨ĭ æİ¥æĶ¶ ï¼Į ä¸į å»ºè®® åģļ èĢĹ æĹ¶ æĵįä½ľ ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbackground Live Event . remove Observer ( observer b ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġob ser vec . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog (" æ·»åĬł è§Ĥ å¯Ł åĻ¨ ", Ġ" observe Ġ- ĠEvent Dispatcher . ASYNC Ġ- Ġ åĲİåı° çº¿ç¨ĭ æİ¥æĶ¶ ï¼Į åı¯ åģļ èĢĹ æĹ¶ æĵįä½ľ ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbackground Live Event . observe ( this , Ġobserver c ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġob ser vec 1 . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog (" ç§»éĻ¤ è§Ĥ å¯Ł åĻ¨ ", Ġ" observe Ġ- ĠEvent Dispatcher . ASYNC Ġ- Ġ åĲİåı° çº¿ç¨ĭ æİ¥æĶ¶ ï¼Į åı¯ åģļ èĢĹ æĹ¶ æĵįä½ľ ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbackground Live Event . remove Observer ( observer c ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġobserved . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog (" æ·»åĬł è§Ĥ å¯Ł åĻ¨ ", Ġ" observe Ġ- Ġcustom EventDispatcher Ġ- Ġ åįķ çĭ¬ æĮĩå®ļ èĩªå®ļä¹ī çº¿ç¨ĭ æİ¥æĶ¶ ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbackground Live Event . observe ( this , Ġobserver d ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġobserved 1 . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog (" ç§»éĻ¤ è§Ĥ å¯Ł åĻ¨ ", Ġ" observe Ġ- Ġcustom EventDispatcher Ġ- Ġ åįķ çĭ¬ æĮĩå®ļ èĩªå®ļä¹ī çº¿ç¨ĭ æİ¥æĶ¶ ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbackground Live Event . remove Observer ( observer d ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Stop () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Stop () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠsetValue ( value : String ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbackground Live Event . setValue ( value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpost Value ( value : String ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbackground Live Event . post Value ( value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlog ( tag : String , Ġvalue : String ? Ġ= Ġnull ){ ĊĊĠĠĠĠĠĠĠ ĠLog . e (" DEMO ", Ġ" tag : Ġ$ tag âĨĴ ĠĠĠĠĠ Ġ$ value ") ĊĊĠĠĠĠĠĠĠ Ġval ĠdateFormat Ġ= ĠSimpleDateFormat (" HH : mm : ss . SS S ") ĊĠĠĠĠĠĠĠ Ġval ĠcurrentTime Millis Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġval Ġtime Text Ġ= ĠdateFormat . format ( currentTimeMillis ) ĊĊĠĠĠĠĠĠĠ Ġfullscreen _ content . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfullscreen _ content . append ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ n ${ time Text } Ġtag : Ġ$ tag âĨĴ Ġ$ value \ n " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġbackground Open Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠCustom EventDispatcher : ĠEvent Dispatcher Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġthread Executor Ġ= ĠExec utors . new Single Thread Executor ( object Ġ: Thread Factory { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnew Thread ( r : ĠRunnable ): ĠThread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠThread ( r , Ġ" åįķ çĭ¬ æĮĩå®ļçļĦ çº¿ç¨ĭ ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdispatch ( run nable : ĠRunnable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthread Executor . execute ( run nable ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }