package Ġcom . example . android _ study . kotlin ._ 2 _ coroutine Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġcom . example . android _ study . R Ċ import Ġcom . example . android _ study ._ base . Base Activity Ċ import Ġcom . example . android _ study ._ base . util . Log Util Ċ import Ġkotlinx . android . synt hetic . main . activity __ 1 __ base _ ay .* Ċ import Ġkotlinx . coroutines .* Ċ import Ġkotlinx . coroutines . Dispatch ers . IO Ċ import Ġkotlinx . coroutines . Dispatch ers . Main Ċ Ċ class Ġ_ 1 _ Base Ay Ġ: ĠBase Activity () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġget Layout Id () Ġ= ĠR . layout . activity __ 1 __ base _ ay ĊĠĠĠ Ġoverride Ġfun Ġinit View And Data ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġ/* ĠCor outine Scope Ġlifecycle Scope Ġ*/ ĊĠĠĠĠĠĠĠ Ġbutton . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠtextView . text Ġ= Ġ"" ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠCor outine Scope ( Main ). launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 4 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtextView . append (" 1 ĠCor outine Scope ( Main ): ${ Thread . currentThread (). name }\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlifecycle Scope . launch When Created Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 5 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtextView . append (" 2 Ġlifecycle Scope :${ Thread . currentThread (). name }\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCor outine Scope ( IO ). launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 5 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= ĠThread . currentThread (). name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtextView . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtextView . append (" 3 Ġdelay ( IO ): $ name \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCor outine Scope ( IO ). launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( 1 5 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= ĠThread . currentThread (). name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtextView . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtextView . append (" 3 Ġsleep ( IO ): $ name \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ/* Ġlaunch Ġ*/ ĊĠĠĠĠĠĠĠ Ġbutton 1 . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠtextView 1 . text Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCor outine Scope ( Main ). launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtextView 1 . append (" 1 1 1 Ġlaunch - start :${ Thread . currentThread (). name }\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch ( IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 5 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname 1 Ġ= ĠThread . currentThread (). name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtextView 1 . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtextView 1 . append (" 1 Ġ>> Ġ$ name 1 \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtextView 1 . append (" 2 2 2 Ġlaunch - middle :${ Thread . currentThread (). name }\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch ( IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname 1 Ġ= ĠThread . currentThread (). name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtextView 1 . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtextView 1 . append (" 2 Ġ>> Ġ$ name 1 \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtextView 1 . append (" 3 3 3 Ġlaunch - end :${ Thread . currentThread (). name }\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/* Ġwith Context Ġ*/ ĊĠĠĠĠĠĠĠ Ġbutton 2 . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠtextView 2 . text Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCor outine Scope ( Main ). launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtextView 2 . append (" 1 1 1 Ġwith Context - start :${ Thread . currentThread (). name }\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġwith Context ( IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 5 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread . currentThread (). name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtextView 2 . append (" 2 2 2 Ġwith Context - middle :${ Thread . currentThread (). name }\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtextView 2 . append (" 1 Ġ>> Ġ$ res Ġ\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres 1 Ġ= Ġwith Context ( IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread . currentThread (). name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtextView 2 . append (" 2 Ġ>> Ġ$ res 1 Ġ\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtextView 2 . append (" 3 3 3 Ġwith Context - end :${ Thread . currentThread (). name }\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/* Ġasync _ await Ġ*/ ĊĠĠĠĠĠĠĠ Ġbutton 3 . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠtextView 3 . text Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCor outine Scope ( Main ). launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdeferred Ġ= Ġasync ( IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 5 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread . currentThread (). name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtextView 3 . append ( deferred . await () Ġ+ Ġ"\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdeferred 1 Ġ= Ġasync ( IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread . currentThread (). name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtextView 3 . append ( deferred 1 . await () Ġ+ Ġ"\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/* Ġrun Block Ġ*/ ĊĠĠĠĠĠĠĠ Ġbutton 4 . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlifecycle Scope . launch Ġ{ Ġ// Ġthis : ĠCor outine Scope ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 2 0 0 L ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Util . d (" "," Task Ġfrom Ġrun Blocking ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Scope Ġ{ Ġ// ĠåĪĽå»º ä¸Ģä¸ª åįı ç¨ĭ ä½ľçĶ¨ åŁŁ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 5 0 0 L ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Util . d (" "," Task Ġfrom Ġnested Ġlaunch ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 0 0 L ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Util . d (" "," Task Ġfrom Ġcoroutine Ġscope ") // Ġ è¿Ļä¸Ģ è¡Į ä¼ļ åľ¨ åĨħ åµ Į Ġlaunch Ġ ä¹ĭåīį è¾ĵåĩº ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Util . d (" "," Coroutine Ġscope Ġis Ġover ") Ġ// Ġ è¿Ļä¸Ģ è¡Į åľ¨ åĨħ åµ Į Ġlaunch Ġæī§è¡Į å®Į æ¯ķ åĲİ æīį è¾ĵåĩº ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }