package Ġcom . val ery . my application . ui . base . mv vm Ċ Ċ import Ġandroid . arch . lifecycle . Lifecycle Owner Ċ import Ġandroid . arch . lifecycle . Mutable LiveData Ċ import Ġandroid . arch . lifecycle . Observer Ċ import Ġandroid . support . annotation . MainThread Ċ Ċ class ĠAction LiveData < T > Ġ: ĠMutable LiveData < T >() Ġ{ ĊĠĠĠ Ġ@ MainThread ĊĠĠĠ Ġoverride Ġfun Ġobserve ( owner : ĠLifecycle Owner , Ġobserver : ĠObserver < T ?> ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠBe ing Ġstrict Ġabout Ġthe Ġobserver Ġnumbers Ġis Ġup Ġto Ġyou ĊĠĠĠĠĠĠĠ Ġ// ĠI Ġthought Ġit Ġmade Ġsense Ġto Ġonly Ġallow Ġone Ġto Ġhandle Ġthe Ġevent ĊĠĠĠĠĠĠĠ Ġif Ġ( has Observer s ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠThrowable (" Only Ġone Ġobserver Ġat Ġa Ġtime Ġmay Ġsubscribe Ġto Ġa ĠAction LiveData ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsuper . observe ( owner , ĠObserver Ġ{ Ġdata Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġignore Ġany Ġnull Ġvalues Ġand Ġearly Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data Ġ== Ġnull ) Ġreturn @ Observer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobserver . on Changed ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġset Ġthe Ġvalue Ġto Ġnull Ġstraight Ġafter Ġemit ting Ġthe Ġchange Ġto Ġthe Ġobserver ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġmeans Ġthat Ġthe Ġstate Ġof Ġthe Ġdata Ġwill Ġalways Ġbe Ġnull Ġ/ Ġnon Ġexist ent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIt Ġwill Ġonly Ġbe Ġavailable Ġto Ġthe Ġobserver Ġin Ġits Ġcallback Ġand Ġsince Ġwe Ġdo Ġnot Ġemit Ġnull Ġvalues ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġobserver Ġnever Ġreceives Ġa Ġnull Ġvalue Ġand Ġany Ġob servers Ġres uming Ġdo Ġnot Ġreceive Ġthe Ġlast Ġevent . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTherefore Ġit Ġonly Ġemits Ġto Ġthe Ġobserver Ġthe Ġsingle Ġaction Ġso Ġyou Ġare Ġfree Ġto Ġshow Ġmessages Ġover Ġand Ġover Ġagain ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOr Ġlaunch Ġan Ġactivity / dialog Ġor Ġanything Ġthat Ġshould Ġonly Ġhappen Ġonce Ġper Ġaction Ġ/ Ġclick Ġ: ). ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠJust Ġa Ġnicely Ġnamed Ġmethod Ġthat Ġwraps Ġsetting Ġthe Ġvalue ĊĠĠĠ Ġ@ MainThread ĊĠĠĠ Ġfun Ġsend Action ( data : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvalue Ġ= Ġdata ĊĠĠĠ Ġ} Ċ }