package Ġcom . example . countries app . view model Ċ Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġcom . example . countries app . di . D agger Api Component Ċ import Ġcom . example . countries app . model . Countries Service Ċ import Ġcom . example . countries app . model . Country Model Ċ import Ġio . reactivex . android . schedul ers . Android Schedulers Ċ import Ġio . reactivex . dis pos ables . Composite Disposable Ċ import Ġio . reactivex . ob servers . Disposable Single Observer Ċ import Ġio . reactivex . schedul ers . Schedulers Ċ import Ġjavax . inject . Inject Ċ Ċ // ViewModel Ġdoesn 't Ġreally Ġcare Ġor Ġknow Ġwho Ġreceives Ġvalues Ġfrom Ġlive Ġdata Ġ( separ ation Ġof Ġconcerns ) Ċ class ĠList ViewModel Ġ: ĠViewModel () Ġ{ ĊĊĠĠĠ Ġ// LiveData Ġis Ġan Ġobject Ġthat Ġgenerates Ġvalues Ġasynchronously ĊĠĠĠ Ġ// Mutable LiveData Ġis Ġan Ġobservable Ġwhose Ġvalues Ġwe Ġcan Ġset ĊĠĠĠ Ġval Ġcountries Ġ= ĠMutable LiveData < List < Country Model >>() ĊĠĠĠ Ġval Ġcountry Load Error Ġ= ĠMutable LiveData < Boolean >() ĊĠĠĠ Ġval Ġloading Ġ= ĠMutable LiveData < Boolean >() ĊĊĠĠĠ Ġprivate Ġval Ġcomposite Disposable Ġ= ĠComposite Disposable () ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġcountries Service : ĠCount ries Service ĊĊĠĠĠ Ġfun Ġrefresh () Ġ{ ĊĠĠĠĠĠĠĠ Ġfetch Countries () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* PRE ĠRet ro ĠFit */ Ċ // ĠĠĠ Ġprivate Ġfun Ġfetch Countries (){ Ċ // ĠĠĠĠĠĠĠ Ġval Ġcountry 1 Ġ= ĠCountry Model (" Al ban ia ", Ġ" T ir ana ", Ġ"") Ċ // ĠĠĠĠĠĠĠ Ġval Ġcountry 2 Ġ= ĠCountry Model (" Br azil ", Ġ" Br as ilia ", Ġ"") Ċ // ĠĠĠĠĠĠĠ Ġval Ġcountry 3 Ġ= ĠCountry Model (" C zech ia ", Ġ" P ra ha ", Ġ"") Ċ // Ċ // ĠĠĠĠĠĠĠ Ġval Ġlist Ġ= ĠlistOf ( country 1 , Ġcountry 2 , Ġcountry 3 ) Ċ // ĠĠĠĠĠĠĠ Ġcountries . value Ġ= Ġlist Ċ // ĠĠĠĠĠĠĠ Ġcountry Load Error . value Ġ= Ġfalse Ċ // ĠĠĠĠĠĠĠ Ġloading . value Ġ= Ġfalse Ċ // Ċ // ĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ ĠD agger Api Component . create (). inject ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfetch Countries () Ġ{ ĊĠĠĠĠĠĠĠ Ġloading . value Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġcomposite Disposable . add ( Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠCount ries Service . getCount ries () ĠĠ Ġ// PRE - D agger ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcountries Service . getCount ries () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . new Thread ()) ĠĠĠĠĠĠĠ Ġ// Ġ Ġso Ġcommunication Ġhappens Ġon Ġnew Ġthread ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) Ġ Ġ// Ġ Ġresponse Ġhandled Ġon Ġmain Ġthread ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe With ( object Ġ: ĠDis posable Single Observer < List < Country Model >>() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( country Models : ĠList < Country Model >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcountries . value Ġ= Ġcountry Models ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcountry Load Error . value Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloading . value Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonError ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcountry Load Error . value Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloading . value Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Cle ared () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Cle ared () ĊĠĠĠĠĠĠĠ Ġ// Ġ Ġas Ġthe Ġrequest Ġis Ġhappening Ġin Ġbackground Ġthread Ġwe Ġwant Ġto Ġdispose Ġthe Ġoperation Ġin Ġcase Ġits Ġnot Ġrequired Ġanymore Ġe . g . Ġuser Ġcloses Ġthe Ġapp ĊĠĠĠĠĠĠĠ Ġcomposite Disposable . clear () ĊĠĠĠ Ġ} Ċ }