/* Ċ Ġ* ĠCopyright Ġ 2 0 1 6 - 2 0 2 0 ĠJetBrains Ġs . r . o . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense . Ċ Ġ*/ Ċ Ċ package Ġkotlinx . coroutines Ċ Ċ /** Ċ Ġ* ĠBase Ġclass Ġfor Ġspecial Ġ[ Coroutine Dispatcher ] Ġwhich Ġis Ġconf ined Ġto Ġapplication Ġ" Main " Ġor Ġ" UI " Ġthread Ċ Ġ* Ġand Ġused Ġfor Ġany ĠUI - based Ġactivities . ĠInstance Ġof Ġ` Main Dispatcher ` Ġcan Ġbe Ġobtained Ġby Ġ[ Dispatch ers . Main ]. Ċ Ġ* Ċ Ġ* ĠPlatform Ġmay Ġor Ġmay Ġnot Ġprovide Ġinstance Ġof Ġ` Main Dispatcher `, Ġsee Ġdocumentation Ġto Ġ[ Dispatch ers . Main ] Ċ Ġ*/ Ċ public Ġabstract Ġclass ĠMain Coroutine Dispatcher Ġ: ĠCor outine Dispatcher () Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġdispatcher Ġthat Ġexecutes Ġcor outines Ġimmediately Ġwhen Ġit Ġis Ġalready Ġin Ġthe Ġright Ġcontext ĊĠĠĠĠ Ġ* Ġ( e . g . Ġcurrent Ġlo oper Ġis Ġthe Ġsame Ġas Ġthis Ġhandler 's Ġlo oper ) Ġwithout Ġan Ġadditional Ġ[ re - dispatch ][ Coroutine Dispatcher . dispatch ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIm mediate Ġdispatcher Ġis Ġsafe Ġfrom Ġstack Ġoverflow s Ġand Ġin Ġcase Ġof Ġnested Ġinv ocations Ġforms Ġevent - loop Ġsimilar Ġto Ġ[ Dispatch ers . Un conf ined ]. ĊĠĠĠĠ Ġ* ĠThe Ġevent Ġloop Ġis Ġan Ġadvanced Ġtopic Ġand Ġits Ġimp lications Ġcan Ġbe Ġfound Ġin Ġ[ Dispatch ers . Un conf ined ] Ġdocumentation . ĊĠĠĠĠ Ġ* ĠThe Ġformed Ġevent - loop Ġis Ġshared Ġwith Ġ[ Un conf ined ] Ġand Ġother Ġimmediate Ġdispatch ers , Ġpotentially Ġoverlapping Ġtasks Ġbetween Ġthem . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠExample Ġof Ġusage : ĊĠĠĠĠ Ġ* Ġ``` ĊĠĠĠĠ Ġ* Ġsuspend Ġfun Ġupdate Ui Element ( val Ġtext : ĠString ) Ġ{ ĊĠĠĠĠ Ġ* ĠĠ Ġ/* ĊĠĠĠĠ Ġ* ĠĠĠ Ġ* ĠIf Ġit Ġis Ġknown Ġthat Ġupdate Ui Element Ġcan Ġbe Ġinvoked Ġboth Ġfrom Ġthe ĠMain Ġthread Ġand Ġfrom Ġother Ġthreads , ĊĠĠĠĠ Ġ* ĠĠĠ Ġ* Ġ` immediate ` Ġdispatcher Ġis Ġused Ġas Ġa Ġperformance Ġoptimization Ġto Ġavoid Ġunnecessary Ġdispatch . ĊĠĠĠĠ Ġ* ĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠĠĠ Ġ* ĠIn Ġthat Ġcase , Ġwhen Ġ` update Ui Element ` Ġis Ġinvoked Ġfrom Ġthe ĠMain Ġthread , Ġ` ui Element . text ` Ġwill Ġbe ĊĠĠĠĠ Ġ* ĠĠĠ Ġ* Ġinvoked Ġimmediately Ġwithout Ġany Ġdispatch ing , Ġotherwise , Ġthe Ġ` Dispatch ers . Main ` Ġdispatch Ġcycle Ġwill Ġbe Ġtriggered . ĊĠĠĠĠ Ġ* ĠĠĠ Ġ*/ ĊĠĠĠĠ Ġ* ĠĠ Ġwith Context ( Dispatch ers . Main . immediate ) Ġ{ ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġui Element . text Ġ= Ġtext ĊĠĠĠĠ Ġ* ĠĠ Ġ} ĊĠĠĠĠ Ġ* ĠĠ Ġ// ĠDo Ġcontext - independent Ġlogic Ġsuch Ġas Ġlogging ĊĠĠĠĠ Ġ* Ġ} ĊĠĠĠĠ Ġ* Ġ``` ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠMethod Ġmay Ġthrow Ġ[ Unsupported OperationException ] Ġif Ġimmediate Ġdispatch ing Ġis Ġnot Ġsupported Ġby Ġcurrent Ġdispatcher , ĊĠĠĠĠ Ġ* Ġplease Ġrefer Ġto Ġspecific Ġdispatcher Ġdocumentation . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ[ Dispatch ers . Main ] Ġsupports Ġimmediate Ġexecution Ġfor ĠAndroid , ĠJava Fx Ġand ĠSw ing Ġplatforms . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġabstract Ġval Ġimmediate : ĠMain Coroutine Dispatcher ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġname Ġof Ġthis Ġmain Ġdispatcher Ġfor Ġdebugging Ġpurposes . ĠThis Ġimplementation Ġreturns ĊĠĠĠĠ Ġ* Ġ` Dispatch ers . Main ` Ġor Ġ` Dispatch ers . Main . immediate ` Ġif Ġit Ġis Ġthe Ġsame Ġas Ġthe Ġcorresponding ĊĠĠĠĠ Ġ* Ġreference Ġin Ġ[ Dispatch ers ] Ġor Ġa Ġshort Ġclass - name Ġrepresentation Ġwith Ġaddress Ġotherwise . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= ĠtoString Internal Impl () Ġ?: Ġ"$ class Simple Name @ $ hex Address " ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInternal Ġmethod Ġfor Ġmore Ġspecific Ġ[ toString ] Ġimplementations . ĠIt Ġreturns Ġnon - null ĊĠĠĠĠ Ġ* Ġstring Ġif Ġthis Ġdispatcher Ġis Ġset Ġin Ġthe Ġplatform Ġas Ġthe Ġmain Ġone . ĊĠĠĠĠ Ġ* Ġ@ suppress ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Internal Cor outines Api ĊĠĠĠ Ġprotected Ġfun ĠtoString Internal Impl (): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmain Ġ= ĠDispatch ers . Main ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġmain ) Ġreturn Ġ" Dispatch ers . Main " ĊĠĠĠĠĠĠĠ Ġval Ġimmediate Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ Ġmain . immediate Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcatch Ġ( e : ĠUnsupportedOperationException ) Ġ{ Ġnull Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġimmediate ) Ġreturn Ġ" Dispatch ers . Main . immediate " ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} Ċ } Ċ