/* Ċ Ġ* ĠCopyright Ġ 2 0 1 8 ĠGoogle ĠLLC Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttps :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . example . android . kotlin coroutines . main Ċ Ċ import Ġandroid . util . Log Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġkotlinx . coroutines .* Ċ Ċ /** Ċ Ġ* ĠMain ViewModel Ġdesigned Ġto Ġstore Ġand Ġmanage ĠUI - related Ġdata Ġin Ġa Ġlifecycle Ġcon sc ious Ġway . ĠThis Ċ Ġ* Ġallows Ġdata Ġto Ġsurv ive Ġconfiguration Ġchanges Ġsuch Ġas Ġscreen Ġrot ations . ĠIn Ġaddition , Ġbackground Ċ Ġ* Ġwork Ġsuch Ġas Ġfetching Ġnetwork Ġresults Ġcan Ġcontinue Ġthrough Ġconfiguration Ġchanges Ġand Ġdeliver Ċ Ġ* Ġresults Ġafter Ġthe Ġnew ĠFragment Ġor ĠActivity Ġis Ġavailable . Ċ Ġ*/ Ċ class ĠMain ViewModel Ġ: ĠViewModel () Ġ{ ĊĊĠĠĠ Ġ/** ĠChildren Ġof Ġa Ġsupervisor Ġjob Ġcan Ġfail Ġindependently Ġof Ġeach Ġother . Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġsupervisor Job Ġ= ĠSuper visor Job () ĊĊĠĠĠ Ġ/** Jobs Ġcan Ġbe Ġarrange d Ġinto Ġparent - child Ġh ierarch ies Ġwhere Ġcancellation ĊĠĠĠĠ Ġ* Ġof Ġparent Ġlead Ġto Ġan Ġimmediate Ġcancellation Ġof Ġall Ġits Ġchildren . ĊĠĠĠĠ Ġ* ĠFailure Ġor Ġcancellation Ġof Ġa Ġchild Ġwith Ġan Ġexception Ġother Ġthan ĊĠĠĠĠ Ġ* ĠC ancellation Exception Ġimmediately Ġcancel s Ġits Ġparent . ĊĠĠĠĠ Ġ* ĠThis Ġway , Ġparent Ġcan Ġcancel Ġits Ġown Ġchildren Ġ( including Ġall Ġtheir ĊĠĠĠĠ Ġ* Ġchildren Ġrecursively ) Ġwithout Ġcancell ing Ġitself .*/ ĊĠĠĠ Ġprivate Ġval ĠviewModel Job : ĠJob Ġ= ĠJob () ĊĠĠĠ Ġprivate Ġval Ġui Scope : ĠCor outine Scope Ġ= ĠCor outine Scope ( Dispatch ers . Main Ġ+ ĠviewModel Job ) ĊĊĠĠĠ Ġoverride Ġfun Ġon Cle ared () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Cle ared () ĊĠĠĠĠĠĠĠ ĠviewModel Job . cancel () ĊĠĠĠĠĠĠĠ Ġui Scope . cancel () Ġ// ĠD ON ' T ! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRequest Ġa Ġsn ackbar LiveData Ġto Ġdisplay Ġa Ġstring . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġvariable Ġis Ġprivate Ġbecause Ġwe Ġdon 't Ġwant Ġto Ġexpose ĠMutable LiveData ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠMutable LiveData Ġallows Ġanyone Ġto Ġset Ġa Ġvalue , Ġand ĠMain ViewModel Ġis Ġthe Ġonly ĊĠĠĠĠ Ġ* Ġclass Ġthat Ġshould Ġbe Ġsetting Ġvalues . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġ_ sn ackBar LiveData Ġ= ĠMutable LiveData < String >() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRequest Ġa Ġsn ackbar LiveData Ġto Ġdisplay Ġa Ġstring . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġsn ackbar LiveData : ĠLive Data < String > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ sn ackBar LiveData ĊĊĠĠĠ Ġfun Ġon View Clicked 2 (): ĠUnit Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch ( viewModel Job , ĠCor outine Start . LA ZY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 0 0 0 ) Ġ// non Ġblocking Ġdelay ; ĠS chedules Ġthe Ġoperation Ġfor Ġthe Ġspecified Ġtime Ġin Ġfuture ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWait Ġone Ġsecond Ġthen Ġdisplay Ġa Ġsn ackbar LiveData . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġon Main View Clicked () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠReplace Ġwith Ġcoroutine Ġimplementation ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Ġ= ĠThread . currentThread (). name ĊĠĠĠĠĠĠĠ ĠLog . i (" Ser gio > Ġ", Ġ" current : Ġ$ current ") ĊĠĠĠĠĠĠĠ Ġui Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc urren te Ġ= ĠThread . currentThread (). name ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i (" Ser gio > Ġ", Ġ" current : Ġ$ c urren te ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( 5 _ 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i (" Ser gio > Ġ", Ġ" current : Ġ$ c urren te ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġuse Ġpost Value Ġsince Ġwe 're Ġin Ġa Ġbackground Ġthread ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ sn ackBar LiveData . post Value (" Hello , Ġfrom Ġthreads !") ĊĠĠĠĠĠĠĠ Ġ} ĊĊ Ċ // ĠĠĠĠĠĠĠ ĠBACK GROUND . submit Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( 1 _ 0 0 0 ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġuse Ġpost Value Ġsince Ġwe 're Ġin Ġa Ġbackground Ġthread Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ_ sn ackBar LiveData . post Value (" Hello , Ġfrom Ġthreads !") Ċ // ĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalled Ġimmediately Ġafter Ġthe ĠUI Ġshows Ġthe Ġsn ackbar LiveData . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġon Snackbar Shown () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ sn ackBar LiveData . value Ġ= Ġnull ĊĠĠĠ Ġ} Ċ } Ċ