package Ġcom . nut r ition . express . ui . post . blog Ċ Ċ import Ġandroid . util . Log Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . switch Map Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġcom . nut r ition . express . model . api . ApiClient Ċ import Ġcom . nut r ition . express . model . api . ApiResponse Ċ import Ġcom . nut r ition . express . model . api . Resource Ċ import Ġcom . nut r ition . express . model . api . bean . UserInfo Ċ import Ġcom . nut r ition . express . model . api . repo . Test Repo Ċ import Ġcom . nut r ition . express . model . api . service . Test Service Ċ import Ġkotlinx . coroutines .* Ċ import Ġretrofit 2 . create Ċ Ċ class ĠTest ViewModel Ġ: ĠViewModel () Ġ{ ĊĠĠĠ Ġprivate Ġval Ġtest Repo Ġ= ĠTest Repo ( viewModel Scope . coroutine Context ) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspend CPU ( 5 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" Test ViewModel ", Ġ" sp end CPU : Ġend ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Test ViewModel ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" sp end CPU : Ġthis Ġblock Ġcode Ġcontinue Ġin Ġ${ Thread . currentThread (). name }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠLog . d (" Test ViewModel ", Ġ" init : Ġnot Ġblock Ġby Ġspend CPU Ġ-> Ġ${ Thread . currentThread (). name }") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġspend CPU ( ms : ĠLong ) Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstart Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġvar Ġgap Ġ= Ġstart ĊĠĠĠĠĠĠĠ Ġwhile Ġ( isActive Ġ&& ĠSystem . currentTimeMillis () Ġ- Ġstart Ġ< Ġms ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( System . currentTimeMillis () Ġ- Ġgap Ġ> Ġ 1 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" sp end Ġcpu ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgap Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġlog () Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d (" Test ViewModel ", Ġ" log : Ġjust Ġlog ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval ĠuserInfo Data 1 Ġ= ĠMutable LiveData < Resource < UserInfo >>() ĊĠĠĠ Ġfun Ġfetch UserInfo () Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d (" Test ViewModel ", Ġ" init : Ġ${ Thread . currentThread (). name }") ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" Test ViewModel ", Ġ" launch : Ġ${ Thread . currentThread (). name }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" Test ViewModel ", Ġ" thread : Ġ${ Thread . currentThread (). id }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġservice : ĠTest Service Ġ= ĠApi Client . get Ret rofit (). create () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse : ĠApiResponse < UserInfo > Ġ= Ġservice . getUser Info () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" Test ViewModel ", Ġ" response : Ġ${ Thread . currentThread (). name }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" Test ViewModel ", Ġ" response : Ġ${ response . response ?. user ?. name }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserInfo Data 1 . value Ġ= ĠResource . Success ( response . response ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" Test ViewModel ", Ġ" e : Ġ${ e . message }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" Test ViewModel ", Ġ" fetch UserInfo : Ġafter Ġawait ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠLog . d (" Test ViewModel ", Ġ" fetch UserInfo : Ġnot Ġblock ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġ_ uid Data Ġ= ĠMutable LiveData < String >() ĊĠĠĠ Ġval ĠuserInfo Data Ġ= Ġ_ uid Data . switch Map ( test Repo :: getUser Info ) ĊĊĠĠĠ Ġfun Ġset UserId ( uid : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ uid Data . value Ġ= Ġuid ĊĠĠĠ Ġ} Ċ Ċ }