CINXE.COM

<!doctype html><html lang="en"><head><title data-rh="true">The easiest way to understand and use Coroutines in Kotlin | by Samarthbnsl | Nov, 2024 | Medium</title><meta data-rh="true" charset="utf-8"/><meta data-rh="true" name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1,maximum-scale=1"/><meta data-rh="true" name="theme-color" content="#000000"/><meta data-rh="true" name="twitter:app:name:iphone" content="Medium"/><meta data-rh="true" name="twitter:app:id:iphone" content="828256236"/><meta data-rh="true" property="al:ios:app_name" content="Medium"/><meta data-rh="true" property="al:ios:app_store_id" content="828256236"/><meta data-rh="true" property="al:android:package" content="com.medium.reader"/><meta data-rh="true" property="fb:app_id" content="542599432471018"/><meta data-rh="true" property="og:site_name" content="Medium"/><meta data-rh="true" property="og:type" content="article"/><meta data-rh="true" property="article:published_time" content="2024-11-22T21:39:25.757Z"/><meta data-rh="true" name="title" content="The easiest way to understand and use Coroutines in Kotlin | by Samarthbnsl | Nov, 2024 | Medium"/><meta data-rh="true" property="og:title" content="The easiest way to understand and use Coroutines in Kotlin"/><meta data-rh="true" property="al:android:url" content="medium://p/5c2301120952"/><meta data-rh="true" property="al:ios:url" content="medium://p/5c2301120952"/><meta data-rh="true" property="al:android:app_name" content="Medium"/><meta data-rh="true" name="description" content="As soon as you start building your Android app, you might need to store some data or values that persist locally over time. Jetpack Compose offers two solutions for this: Room database and DataStore…"/><meta data-rh="true" property="og:description" content="As soon as you start building your Android app, you might need to store some data or values that persist locally over time. Jetpack Compose…"/><meta data-rh="true" property="og:url" content="https://medium.com/@samarthbnsl/the-easiest-way-to-understand-and-use-coroutines-in-kotlin-5c2301120952"/><meta data-rh="true" property="al:web:url" content="https://medium.com/@samarthbnsl/the-easiest-way-to-understand-and-use-coroutines-in-kotlin-5c2301120952"/><meta data-rh="true" property="article:author" content="https://medium.com/@samarthbnsl"/><meta data-rh="true" name="author" content="Samarthbnsl"/><meta data-rh="true" name="robots" content="index,noarchive,follow,max-image-preview:large"/><meta data-rh="true" name="referrer" content="unsafe-url"/><meta data-rh="true" property="twitter:title" content="The easiest way to understand and use Coroutines in Kotlin"/><meta data-rh="true" name="twitter:site" content="@Medium"/><meta data-rh="true" name="twitter:app:url:iphone" content="medium://p/5c2301120952"/><meta data-rh="true" property="twitter:description" content="As soon as you start building your Android app, you might need to store some data or values that persist locally over time. Jetpack Compose…"/><meta data-rh="true" name="twitter:card" content="summary"/><meta data-rh="true" name="twitter:label1" content="Reading time"/><meta data-rh="true" name="twitter:data1" content="5 min read"/><link data-rh="true" rel="icon" href="https://miro.medium.com/v2/5d8de952517e8160e40ef9841c781cdc14a5db313057fa3c3de41c6f5b494b19"/><link data-rh="true" rel="search" type="application/opensearchdescription+xml" title="Medium" href="/osd.xml"/><link data-rh="true" rel="apple-touch-icon" sizes="152x152" href="https://miro.medium.com/v2/resize:fill:304:304/10fd5c419ac61637245384e7099e131627900034828f4f386bdaa47a74eae156"/><link data-rh="true" rel="apple-touch-icon" sizes="120x120" href="https://miro.medium.com/v2/resize:fill:240:240/10fd5c419ac61637245384e7099e131627900034828f4f386bdaa47a74eae156"/><link data-rh="true" rel="apple-touch-icon" sizes="76x76" href="https://miro.medium.com/v2/resize:fill:152:152/10fd5c419ac61637245384e7099e131627900034828f4f386bdaa47a74eae156"/><link data-rh="true" rel="apple-touch-icon" sizes="60x60" href="https://miro.medium.com/v2/resize:fill:120:120/10fd5c419ac61637245384e7099e131627900034828f4f386bdaa47a74eae156"/><link data-rh="true" rel="mask-icon" href="https://miro.medium.com/v2/resize:fill:1000:1000/7*GAOKVe--MXbEJmV9230oOQ.png" color="#171717"/><link data-rh="true" rel="preconnect" href="https://glyph.medium.com" crossOrigin=""/><link data-rh="true" id="glyph_preload_link" rel="preload" as="style" type="text/css" href="https://glyph.medium.com/css/unbound.css"/><link data-rh="true" id="glyph_link" rel="stylesheet" type="text/css" href="https://glyph.medium.com/css/unbound.css"/><link data-rh="true" rel="author" href="https://medium.com/@samarthbnsl"/><link data-rh="true" rel="canonical" href="https://medium.com/@samarthbnsl/the-easiest-way-to-understand-and-use-coroutines-in-kotlin-5c2301120952"/><link data-rh="true" rel="alternate" href="android-app://com.medium.reader/https/medium.com/p/5c2301120952"/><script data-rh="true" type="application/ld+json">{"@context":"http:\u002F\u002Fschema.org","@type":"NewsArticle","image":{"@type":"ImageObject","url":"https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fda:true\u002Fbd978bb536350a710e8efb012513429cabdc4c28700604261aeda246d0f980b7","height":810,"width":1440},"url":"https:\u002F\u002Fmedium.com\u002F@samarthbnsl\u002Fthe-easiest-way-to-understand-and-use-coroutines-in-kotlin-5c2301120952","dateCreated":"2024-11-22T21:39:25.757Z","datePublished":"2024-11-22T21:39:25.757Z","dateModified":"2024-11-23T02:53:12.461Z","headline":"The easiest way to understand and use Coroutines in Kotlin","name":"The easiest way to understand and use Coroutines in Kotlin","description":"As soon as you start building your Android app, you might need to store some data or values that persist locally over time. Jetpack Compose offers two solutions for this: Room database and DataStore…","identifier":"5c2301120952","author":{"@type":"Person","name":"Samarthbnsl","url":"https:\u002F\u002Fmedium.com\u002F@samarthbnsl"},"creator":["Samarthbnsl"],"publisher":{"@type":"Organization","name":"Medium","url":"https:\u002F\u002Fmedium.com\u002F","logo":{"@type":"ImageObject","width":272,"height":60,"url":"https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:544\u002F7*V1_7XP4snlmqrc_0Njontw.png"}},"mainEntityOfPage":"https:\u002F\u002Fmedium.com\u002F@samarthbnsl\u002Fthe-easiest-way-to-understand-and-use-coroutines-in-kotlin-5c2301120952"}</script><style type="text/css" data-fela-rehydration="544" data-fela-type="STATIC">html{box-sizing:border-box;-webkit-text-size-adjust:100%}*, *:before, *:after{box-sizing:inherit}body{margin:0;padding:0;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;color:rgba(0,0,0,0.8);position:relative;min-height:100vh}h1, h2, h3, h4, h5, h6, dl, dd, ol, ul, menu, figure, blockquote, p, pre, form{margin:0}menu, ol, ul{padding:0;list-style:none;list-style-image:none}main{display:block}a{color:inherit;text-decoration:none}a, button, input{-webkit-tap-highlight-color:transparent}img, svg{vertical-align:middle}button{background:transparent;overflow:visible}button, input, optgroup, select, textarea{margin:0}:root{--reach-tabs:1;--reach-menu-button:1}#speechify-root{font-family:Sohne, sans-serif}div[data-popper-reference-hidden="true"]{visibility:hidden;pointer-events:none}.grecaptcha-badge{visibility:hidden} /*XCode style (c) Angel Garcia <angelgarcia.mail@gmail.com>*/.hljs {background: #fff;color: black; }/* Gray DOCTYPE selectors like WebKit */ .xml .hljs-meta {color: #c0c0c0; }.hljs-comment, .hljs-quote {color: #007400; }.hljs-tag, .hljs-attribute, .hljs-keyword, .hljs-selector-tag, .hljs-literal, .hljs-name {color: #aa0d91; }.hljs-variable, .hljs-template-variable {color: #3F6E74; }.hljs-code, .hljs-string, .hljs-meta .hljs-string {color: #c41a16; }.hljs-regexp, .hljs-link {color: #0E0EFF; }.hljs-title, .hljs-symbol, .hljs-bullet, .hljs-number {color: #1c00cf; }.hljs-section, .hljs-meta {color: #643820; }.hljs-title.class_, .hljs-class .hljs-title, .hljs-type, .hljs-built_in, .hljs-params {color: #5c2699; }.hljs-attr {color: #836C28; }.hljs-subst {color: #000; }.hljs-formula {background-color: #eee;font-style: italic; }.hljs-addition {background-color: #baeeba; }.hljs-deletion {background-color: #ffc8bd; }.hljs-selector-id, .hljs-selector-class {color: #9b703f; }.hljs-doctag, .hljs-strong {font-weight: bold; }.hljs-emphasis {font-style: italic; } </style><style type="text/css" data-fela-rehydration="544" data-fela-type="KEYFRAME">@-webkit-keyframes k1{0%{opacity:0.8}50%{opacity:0.5}100%{opacity:0.8}}@-moz-keyframes k1{0%{opacity:0.8}50%{opacity:0.5}100%{opacity:0.8}}@keyframes k1{0%{opacity:0.8}50%{opacity:0.5}100%{opacity:0.8}}</style><style type="text/css" data-fela-rehydration="544" data-fela-type="RULE">.a{font-family:medium-content-sans-serif-font, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif}.b{font-weight:400}.c{background-color:rgba(255, 255, 255, 1)}.l{display:block}.m{position:sticky}.n{top:0}.o{z-index:500}.p{padding:0 24px}.q{align-items:center}.r{border-bottom:solid 1px #F2F2F2}.y{height:41px}.z{line-height:20px}.ab{display:flex}.ac{height:57px}.ae{flex:1 0 auto}.af{color:inherit}.ag{fill:inherit}.ah{font-size:inherit}.ai{border:inherit}.aj{font-family:inherit}.ak{letter-spacing:inherit}.al{font-weight:inherit}.am{padding:0}.an{margin:0}.ao{cursor:pointer}.ap:disabled{cursor:not-allowed}.aq:disabled{color:#6B6B6B}.ar:disabled{fill:#6B6B6B}.au{width:auto}.av path{fill:#242424}.aw{height:25px}.ax{margin-left:16px}.ay{border:none}.az{border-radius:20px}.ba{width:240px}.bb{background:#F9F9F9}.bc path{fill:#6B6B6B}.be{outline:none}.bf{font-family:sohne, "Helvetica Neue", Helvetica, Arial, sans-serif}.bg{font-size:14px}.bh{width:100%}.bi{padding:10px 20px 10px 0}.bj{background-color:transparent}.bk{color:#242424}.bl::placeholder{color:#6B6B6B}.bm{display:inline-block}.bn{margin-left:12px}.bo{margin-right:12px}.bp{border-radius:4px}.bq{margin-left:24px}.br{height:24px}.bx{background-color:#F9F9F9}.by{border-radius:50%}.bz{height:32px}.ca{width:32px}.cb{justify-content:center}.ch{max-width:680px}.ci{min-width:0}.cj{animation:k1 1.2s ease-in-out infinite}.ck{height:100vh}.cl{margin-bottom:16px}.cm{margin-top:48px}.cn{align-items:flex-start}.co{flex-direction:column}.cp{justify-content:space-between}.cq{margin-bottom:24px}.cw{width:80%}.cx{background-color:#F2F2F2}.dd{height:44px}.de{width:44px}.df{margin:auto 0}.dg{margin-bottom:4px}.dh{height:16px}.di{width:120px}.dj{width:80px}.dp{margin-bottom:8px}.dq{width:96%}.dr{width:98%}.ds{width:81%}.dt{margin-left:8px}.du{color:#6B6B6B}.dv{font-size:13px}.dw{height:100%}.ep{color:#FFFFFF}.eq{fill:#FFFFFF}.er{background:#1A8917}.es{border-color:#1A8917}.ew:disabled{cursor:inherit !important}.ex:disabled{opacity:0.3}.ey:disabled:hover{background:#1A8917}.ez:disabled:hover{border-color:#1A8917}.fa{border-radius:99em}.fb{border-width:1px}.fc{border-style:solid}.fd{box-sizing:border-box}.fe{text-decoration:none}.ff{text-align:center}.fi{margin-right:32px}.fj{position:relative}.fk{fill:#6B6B6B}.fn{background:transparent}.fo svg{margin-left:4px}.fp svg{fill:#6B6B6B}.fr{box-shadow:inset 0 0 0 1px rgba(0, 0, 0, 0.05)}.fs{position:absolute}.fz{margin:0 24px}.gd{background:rgba(255, 255, 255, 1)}.ge{border:1px solid #F2F2F2}.gf{box-shadow:0 1px 4px #F2F2F2}.gg{max-height:100vh}.gh{overflow-y:auto}.gi{left:0}.gj{top:calc(100vh + 100px)}.gk{bottom:calc(100vh + 100px)}.gl{width:10px}.gm{pointer-events:none}.gn{word-break:break-word}.go{word-wrap:break-word}.gp:after{display:block}.gq:after{content:""}.gr:after{clear:both}.gs{line-height:1.23}.gt{letter-spacing:0}.gu{font-style:normal}.gv{font-weight:700}.ia{align-items:baseline}.ib{width:48px}.ic{height:48px}.id{border:2px solid rgba(255, 255, 255, 1)}.ie{z-index:0}.if{box-shadow:none}.ig{border:1px solid rgba(0, 0, 0, 0.05)}.ih{margin-bottom:2px}.ii{flex-wrap:nowrap}.ij{font-size:16px}.ik{line-height:24px}.im{margin:0 8px}.in{display:inline}.io{color:#1A8917}.ip{fill:#1A8917}.is{flex:0 0 auto}.iv{flex-wrap:wrap}.iw{padding-left:8px}.ix{padding-right:8px}.jy> *{flex-shrink:0}.jz{overflow-x:scroll}.ka::-webkit-scrollbar{display:none}.kb{scrollbar-width:none}.kc{-ms-overflow-style:none}.kd{width:74px}.ke{flex-direction:row}.kf{z-index:2}.kg{margin-right:4px}.kj{-webkit-user-select:none}.kk{border:0}.kl{fill:rgba(117, 117, 117, 1)}.ko{outline:0}.kp{user-select:none}.kq> svg{pointer-events:none}.kz{cursor:progress}.la{opacity:1}.lb{padding:4px 0}.le{margin-top:0px}.lf{width:16px}.lh{display:inline-flex}.ln{max-width:100%}.lo{padding:8px 2px}.lp svg{color:#6B6B6B}.mg{margin-left:auto}.mh{margin-right:auto}.mi{max-width:570px}.mo{clear:both}.mp{height:auto}.mq{margin-top:10px}.mr{max-width:728px}.mu{line-height:1.58}.mv{letter-spacing:-0.004em}.mw{font-family:source-serif-pro, Georgia, Cambria, "Times New Roman", Times, serif}.nr{margin-bottom:-0.46em}.ns{font-style:italic}.nt{text-decoration:underline}.nu{line-height:1.12}.nv{letter-spacing:-0.022em}.nw{font-weight:600}.or{margin-bottom:-0.28em}.ox{list-style-type:disc}.oy{margin-left:30px}.oz{padding-left:0px}.pk{overflow-x:auto}.pl{font-family:source-code-pro, Menlo, Monaco, "Courier New", Courier, monospace}.pm{padding:32px}.pn{border:1px solid #E5E5E5}.po{line-height:1.4}.pp{margin-top:-0.2em}.pq{margin-bottom:-0.2em}.pr{white-space:pre}.ps{min-width:fit-content}.pt{line-height:1.18}.qh{margin-bottom:-0.31em}.qi{box-shadow:inset 3px 0 0 0 #242424}.qj{padding-left:23px}.qk{margin-left:-20px}.ql{margin-bottom:26px}.qm{margin-top:6px}.qn{margin-top:8px}.qo{margin-right:8px}.qp{padding:8px 16px}.qq{border-radius:100px}.qr{transition:background 300ms ease}.qt{white-space:nowrap}.qu{border-top:none}.qv{margin-bottom:14px}.qw{height:52px}.qx{max-height:52px}.qy{box-sizing:content-box}.qz{position:static}.ra{z-index:1}.rc{max-width:155px}.ri{margin-right:20px}.ro{height:0px}.rp{margin-bottom:40px}.se{height:64px}.sf{width:64px}.sg{align-self:flex-end}.sh{color:rgba(255, 255, 255, 1)}.si{fill:rgba(255, 255, 255, 1)}.sj{background:rgba(25, 25, 25, 1)}.sk{border-color:rgba(25, 25, 25, 1)}.sn:disabled{opacity:0.1}.so:disabled:hover{background:rgba(25, 25, 25, 1)}.sp:disabled:hover{border-color:rgba(25, 25, 25, 1)}.sq{flex:1 1 auto}.sw{padding-right:4px}.sx{font-weight:500}.te{white-space:pre-wrap}.tf{margin-top:16px}.tg{margin-bottom:54px}.tm{gap:18px}.tn{fill:rgba(61, 61, 61, 1)}.tu{border-bottom:solid 1px #E5E5E5}.tv{margin-top:72px}.tw{padding:24px 0}.tx{margin-bottom:0px}.ty{margin-right:16px}.as:hover:not(:disabled){color:rgba(25, 25, 25, 1)}.at:hover:not(:disabled){fill:rgba(25, 25, 25, 1)}.et:hover{background:#156D12}.eu:hover{border-color:#156D12}.ev:hover{cursor:pointer}.fl:hover{color:#242424}.fm:hover{fill:#242424}.fq:hover svg{fill:#242424}.ft:hover{background-color:rgba(0, 0, 0, 0.1)}.il:hover{text-decoration:underline}.iq:hover:not(:disabled){color:#156D12}.ir:hover:not(:disabled){fill:#156D12}.kn:hover{fill:rgba(8, 8, 8, 1)}.lc:hover{fill:#000000}.ld:hover p{color:#000000}.lg:hover{color:#000000}.lq:hover svg{color:#000000}.qs:hover{background-color:#F2F2F2}.sd:hover{background-color:none}.sl:hover{background:#000000}.sm:hover{border-color:#242424}.to:hover{fill:rgba(25, 25, 25, 1)}.bd:focus-within path{fill:#242424}.km:focus{fill:rgba(8, 8, 8, 1)}.lr:focus svg{color:#000000}.kr:active{border-style:none}</style><style type="text/css" data-fela-rehydration="544" data-fela-type="RULE" media="all and (min-width: 1080px)">.d{display:none}.bw{width:64px}.cg{margin:0 64px}.cv{height:48px}.dc{margin-bottom:52px}.do{margin-bottom:48px}.ef{font-size:14px}.eg{line-height:20px}.em{font-size:13px}.eo{padding:5px 12px}.fh{display:flex}.fy{margin-bottom:68px}.gc{max-width:680px}.hq{font-size:42px}.hr{margin-top:1.19em}.hs{margin-bottom:32px}.ht{line-height:52px}.hu{letter-spacing:-0.011em}.hz{align-items:center}.jk{border-top:solid 1px #F2F2F2}.jl{border-bottom:solid 1px #F2F2F2}.jm{margin:32px 0 0}.jn{padding:3px 8px}.jw> *{margin-right:24px}.jx> :last-child{margin-right:0}.ky{margin-top:0px}.lm{margin:0}.mn{margin-top:40px}.nn{font-size:20px}.no{margin-top:2.14em}.np{line-height:32px}.nq{letter-spacing:-0.003em}.on{font-size:24px}.oo{margin-top:1.95em}.op{line-height:30px}.oq{letter-spacing:-0.016em}.ow{margin-top:0.94em}.pe{margin-top:1.14em}.pj{margin-top:56px}.qe{margin-top:1.72em}.qf{line-height:24px}.qg{letter-spacing:0}.rh{display:inline-block}.rn{margin-bottom:104px}.rq{flex-direction:row}.rt{margin-bottom:0}.ru{margin-right:20px}.sr{max-width:500px}.tl{margin-bottom:72px}.tt{padding-top:72px}</style><style type="text/css" data-fela-rehydration="544" data-fela-type="RULE" media="all and (max-width: 1079.98px)">.e{display:none}.kx{margin-top:0px}.ms{margin-left:auto}.mt{text-align:center}.rg{display:inline-block}</style><style type="text/css" data-fela-rehydration="544" data-fela-type="RULE" media="all and (max-width: 903.98px)">.f{display:none}.kw{margin-top:0px}.rf{display:inline-block}</style><style type="text/css" data-fela-rehydration="544" data-fela-type="RULE" media="all and (max-width: 727.98px)">.g{display:none}.ku{margin-top:0px}.kv{margin-right:0px}.re{display:inline-block}</style><style type="text/css" data-fela-rehydration="544" data-fela-type="RULE" media="all and (max-width: 551.98px)">.h{display:none}.s{display:flex}.t{justify-content:space-between}.bs{width:24px}.cc{margin:0 24px}.cr{height:40px}.cy{margin-bottom:44px}.dk{margin-bottom:32px}.dx{font-size:13px}.dy{line-height:20px}.eh{padding:0px 8px 1px}.fu{margin-bottom:4px}.gw{font-size:32px}.gx{margin-top:1.01em}.gy{margin-bottom:24px}.gz{line-height:38px}.ha{letter-spacing:-0.014em}.hv{align-items:flex-start}.it{flex-direction:column}.iy{margin:24px -24px 0}.iz{padding:0}.jo> *{margin-right:8px}.jp> :last-child{margin-right:24px}.kh{margin-left:0px}.ks{margin-top:0px}.kt{margin-right:0px}.li{margin:0}.ls{border:1px solid #F2F2F2}.lt{border-radius:99em}.lu{padding:0px 16px 0px 12px}.lv{height:38px}.lw{align-items:center}.ly svg{margin-right:8px}.mj{margin-top:32px}.mx{font-size:18px}.my{margin-top:1.56em}.mz{line-height:28px}.na{letter-spacing:-0.003em}.nx{font-size:20px}.ny{margin-top:1.2em}.nz{line-height:24px}.oa{letter-spacing:0}.os{margin-top:0.67em}.pa{margin-top:1.34em}.pf{margin-top:40px}.pu{font-size:16px}.pv{margin-top:1.23em}.rd{display:inline-block}.rj{margin-bottom:96px}.sb{margin-bottom:20px}.sc{margin-right:0}.sv{max-width:100%}.sy{font-size:24px}.sz{line-height:30px}.ta{letter-spacing:-0.016em}.th{margin-bottom:64px}.tp{padding-top:48px}.lx:hover{border-color:#E5E5E5}</style><style type="text/css" data-fela-rehydration="544" data-fela-type="RULE" media="all and (min-width: 904px) and (max-width: 1079.98px)">.i{display:none}.bv{width:64px}.cf{margin:0 64px}.cu{height:48px}.db{margin-bottom:52px}.dn{margin-bottom:48px}.ed{font-size:14px}.ee{line-height:20px}.ek{font-size:13px}.el{padding:5px 12px}.fg{display:flex}.fx{margin-bottom:68px}.gb{max-width:680px}.hl{font-size:42px}.hm{margin-top:1.19em}.hn{margin-bottom:32px}.ho{line-height:52px}.hp{letter-spacing:-0.011em}.hy{align-items:center}.jg{border-top:solid 1px #F2F2F2}.jh{border-bottom:solid 1px #F2F2F2}.ji{margin:32px 0 0}.jj{padding:3px 8px}.ju> *{margin-right:24px}.jv> :last-child{margin-right:0}.ll{margin:0}.mm{margin-top:40px}.nj{font-size:20px}.nk{margin-top:2.14em}.nl{line-height:32px}.nm{letter-spacing:-0.003em}.oj{font-size:24px}.ok{margin-top:1.95em}.ol{line-height:30px}.om{letter-spacing:-0.016em}.ov{margin-top:0.94em}.pd{margin-top:1.14em}.pi{margin-top:56px}.qb{margin-top:1.72em}.qc{line-height:24px}.qd{letter-spacing:0}.rm{margin-bottom:104px}.rr{flex-direction:row}.rv{margin-bottom:0}.rw{margin-right:20px}.ss{max-width:500px}.tk{margin-bottom:72px}.ts{padding-top:72px}</style><style type="text/css" data-fela-rehydration="544" data-fela-type="RULE" media="all and (min-width: 728px) and (max-width: 903.98px)">.j{display:none}.w{display:flex}.x{justify-content:space-between}.bu{width:64px}.ce{margin:0 48px}.ct{height:48px}.da{margin-bottom:52px}.dm{margin-bottom:48px}.eb{font-size:13px}.ec{line-height:20px}.ej{padding:0px 8px 1px}.fw{margin-bottom:68px}.ga{max-width:680px}.hg{font-size:42px}.hh{margin-top:1.19em}.hi{margin-bottom:32px}.hj{line-height:52px}.hk{letter-spacing:-0.011em}.hx{align-items:center}.jc{border-top:solid 1px #F2F2F2}.jd{border-bottom:solid 1px #F2F2F2}.je{margin:32px 0 0}.jf{padding:3px 8px}.js> *{margin-right:24px}.jt> :last-child{margin-right:0}.lk{margin:0}.ml{margin-top:40px}.nf{font-size:20px}.ng{margin-top:2.14em}.nh{line-height:32px}.ni{letter-spacing:-0.003em}.of{font-size:24px}.og{margin-top:1.95em}.oh{line-height:30px}.oi{letter-spacing:-0.016em}.ou{margin-top:0.94em}.pc{margin-top:1.14em}.ph{margin-top:56px}.py{margin-top:1.72em}.pz{line-height:24px}.qa{letter-spacing:0}.rl{margin-bottom:104px}.rs{flex-direction:row}.rx{margin-bottom:0}.ry{margin-right:20px}.st{max-width:500px}.tj{margin-bottom:72px}.tr{padding-top:72px}</style><style type="text/css" data-fela-rehydration="544" data-fela-type="RULE" media="all and (min-width: 552px) and (max-width: 727.98px)">.k{display:none}.u{display:flex}.v{justify-content:space-between}.bt{width:24px}.cd{margin:0 24px}.cs{height:40px}.cz{margin-bottom:44px}.dl{margin-bottom:32px}.dz{font-size:13px}.ea{line-height:20px}.ei{padding:0px 8px 1px}.fv{margin-bottom:4px}.hb{font-size:32px}.hc{margin-top:1.01em}.hd{margin-bottom:24px}.he{line-height:38px}.hf{letter-spacing:-0.014em}.hw{align-items:flex-start}.iu{flex-direction:column}.ja{margin:24px 0 0}.jb{padding:0}.jq> *{margin-right:8px}.jr> :last-child{margin-right:8px}.ki{margin-left:0px}.lj{margin:0}.lz{border:1px solid #F2F2F2}.ma{border-radius:99em}.mb{padding:0px 16px 0px 12px}.mc{height:38px}.md{align-items:center}.mf svg{margin-right:8px}.mk{margin-top:32px}.nb{font-size:18px}.nc{margin-top:1.56em}.nd{line-height:28px}.ne{letter-spacing:-0.003em}.ob{font-size:20px}.oc{margin-top:1.2em}.od{line-height:24px}.oe{letter-spacing:0}.ot{margin-top:0.67em}.pb{margin-top:1.34em}.pg{margin-top:40px}.pw{font-size:16px}.px{margin-top:1.23em}.rk{margin-bottom:96px}.rz{margin-bottom:20px}.sa{margin-right:0}.su{max-width:100%}.tb{font-size:24px}.tc{line-height:30px}.td{letter-spacing:-0.016em}.ti{margin-bottom:64px}.tq{padding-top:48px}.me:hover{border-color:#E5E5E5}</style><style type="text/css" data-fela-rehydration="544" data-fela-type="RULE" media="print">.rb{display:none}</style></head><body><div id="root"><div class="a b c"><div class="d e f g h i j k"></div><script>document.domain = document.domain;</script><div class="l c"><div class="l m n o c"><div class="p q r s t u v w x i d y z"><a class="du ag dv bf ak b am an ao ap aq ar as at s u w i d q dw z" href="https://rsci.app.link/?%24canonical_url=https%3A%2F%2Fmedium.com%2Fp%2F5c2301120952&amp;%7Efeature=LoOpenInAppButton&amp;%7Echannel=ShowPostUnderUser&amp;source=---top_nav_layout_nav----------------------------------" rel="noopener follow">Open in app<svg xmlns="http://www.w3.org/2000/svg" width="10" height="10" fill="none" viewBox="0 0 10 10" class="dt"><path fill="currentColor" d="M.985 8.485a.375.375 0 1 0 .53.53zM8.75 1.25h.375A.375.375 0 0 0 8.75.875zM8.375 6.5a.375.375 0 1 0 .75 0zM3.5.875a.375.375 0 1 0 0 .75zm-1.985 8.14 7.5-7.5-.53-.53-7.5 7.5zm6.86-7.765V6.5h.75V1.25zM3.5 1.625h5.25v-.75H3.5z"></path></svg></a><div class="ab q"><p class="bf b dx dy dz ea eb ec ed ee ef eg du"><span><button class="bf b dx dy eh dz ea ei eb ec ej ek ee el em eg eo ep eq er es et eu ev ew ex ey ez fa fb fc fd bm fe ff" data-testid="headerSignUpButton">Sign up</button></span></p><div class="ax l"><p class="bf b dx dy dz ea eb ec ed ee ef eg du"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="headerSignInButton" rel="noopener follow" href="/m/signin?operation=login&amp;redirect=https%3A%2F%2Fmedium.com%2F%40samarthbnsl%2Fthe-easiest-way-to-understand-and-use-coroutines-in-kotlin-5c2301120952&amp;source=post_page---top_nav_layout_nav-----------------------global_nav-----------">Sign in</a></span></p></div></div></div><div class="p q r ab ac"><div class="ab q ae"><a class="af ag ah ai aj ak al am an ao ap aq ar as at ab" aria-label="Homepage" data-testid="headerMediumLogo" rel="noopener follow" href="/?source=---top_nav_layout_nav----------------------------------"><svg xmlns="http://www.w3.org/2000/svg" width="719" height="160" fill="none" viewBox="0 0 719 160" class="au av aw"><path fill="#242424" d="m174.104 9.734.215-.047V8.02H130.39L89.6 103.89 48.81 8.021H1.472v1.666l.212.047c8.018 1.81 12.09 4.509 12.09 14.242V137.93c0 9.734-4.087 12.433-12.106 14.243l-.212.047v1.671h32.118v-1.665l-.213-.048c-8.018-1.809-12.089-4.509-12.089-14.242V30.586l52.399 123.305h2.972l53.925-126.743V140.75c-.687 7.688-4.721 10.062-11.982 11.701l-.215.05v1.652h55.948v-1.652l-.215-.05c-7.269-1.639-11.4-4.013-12.087-11.701l-.037-116.774h.037c0-9.733 4.071-12.432 12.087-14.242m25.555 75.488c.915-20.474 8.268-35.252 20.606-35.507 3.806.063 6.998 1.312 9.479 3.714 5.272 5.118 7.751 15.812 7.368 31.793zm-.553 5.77h65.573v-.275c-.186-15.656-4.721-27.834-13.466-36.196-7.559-7.227-18.751-11.203-30.507-11.203h-.263c-6.101 0-13.584 1.48-18.909 4.16-6.061 2.807-11.407 7.003-15.855 12.511-7.161 8.874-11.499 20.866-12.554 34.343q-.05.606-.092 1.212a50 50 0 0 0-.065 1.151 85.807 85.807 0 0 0-.094 5.689c.71 30.524 17.198 54.917 46.483 54.917 25.705 0 40.675-18.791 44.407-44.013l-1.886-.664c-6.557 13.556-18.334 21.771-31.738 20.769-18.297-1.369-32.314-19.922-31.042-42.395m139.722 41.359c-2.151 5.101-6.639 7.908-12.653 7.908s-11.513-4.129-15.418-11.63c-4.197-8.053-6.405-19.436-6.405-32.92 0-28.067 8.729-46.22 22.24-46.22 5.657 0 10.111 2.807 12.236 7.704zm43.499 20.008c-8.019-1.897-12.089-4.722-12.089-14.951V1.309l-48.716 14.353v1.757l.299-.024c6.72-.543 11.278.386 13.925 2.83 2.072 1.915 3.082 4.853 3.082 8.987v18.66c-4.803-3.067-10.516-4.56-17.448-4.56-14.059 0-26.909 5.92-36.176 16.672-9.66 11.205-14.767 26.518-14.767 44.278-.003 31.72 15.612 53.039 38.851 53.039 13.595 0 24.533-7.449 29.54-20.013v16.865h43.711v-1.746zM424.1 19.819c0-9.904-7.468-17.374-17.375-17.374-9.859 0-17.573 7.632-17.573 17.374s7.721 17.374 17.573 17.374c9.907 0 17.375-7.47 17.375-17.374m11.499 132.546c-8.019-1.897-12.089-4.722-12.089-14.951h-.035V43.635l-43.714 12.551v1.705l.263.024c9.458.842 12.047 4.1 12.047 15.152v81.086h43.751v-1.746zm112.013 0c-8.018-1.897-12.089-4.722-12.089-14.951V43.635l-41.621 12.137v1.71l.246.026c7.733.813 9.967 4.257 9.967 15.36v59.279c-2.578 5.102-7.415 8.131-13.274 8.336-9.503 0-14.736-6.419-14.736-18.073V43.638l-43.714 12.55v1.703l.262.024c9.459.84 12.05 4.097 12.05 15.152v50.17a56.3 56.3 0 0 0 .91 10.444l.787 3.423c3.701 13.262 13.398 20.197 28.59 20.197 12.868 0 24.147-7.966 29.115-20.43v17.311h43.714v-1.747zm169.818 1.788v-1.749l-.213-.05c-8.7-2.006-12.089-5.789-12.089-13.49v-63.79c0-19.89-11.171-31.761-29.883-31.761-13.64 0-25.141 7.882-29.569 20.16-3.517-13.01-13.639-20.16-28.606-20.16-13.146 0-23.449 6.938-27.869 18.657V43.643L545.487 55.68v1.715l.263.024c9.345.829 12.047 4.181 12.047 14.95v81.784h40.787v-1.746l-.215-.053c-6.941-1.631-9.181-4.606-9.181-12.239V66.998c1.836-4.289 5.537-9.37 12.853-9.37 9.086 0 13.692 6.296 13.692 18.697v77.828h40.797v-1.746l-.215-.053c-6.94-1.631-9.18-4.606-9.18-12.239V75.066a42 42 0 0 0-.578-7.26c1.947-4.661 5.86-10.177 13.475-10.177 9.214 0 13.691 6.114 13.691 18.696v77.828z"></path></svg></a><div class="ax h"><div class="ab ay az ba bb q bc bd"><div class="bm" aria-hidden="false" aria-describedby="searchResults" aria-labelledby="searchResults"></div><div class="bn bo ab"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M4.092 11.06a6.95 6.95 0 1 1 13.9 0 6.95 6.95 0 0 1-13.9 0m6.95-8.05a8.05 8.05 0 1 0 5.13 14.26l3.75 3.75a.56.56 0 1 0 .79-.79l-3.73-3.73A8.05 8.05 0 0 0 11.042 3z" clip-rule="evenodd"></path></svg></div><input role="combobox" aria-controls="searchResults" aria-expanded="false" aria-label="search" data-testid="headerSearchInput" tabindex="0" class="ay be bf bg z bh bi bj bk bl" placeholder="Search" value=""/></div></div></div><div class="h k w fg fh"><div class="fi ab"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="headerWriteButton" rel="noopener follow" href="/m/signin?operation=register&amp;redirect=https%3A%2F%2Fmedium.com%2Fnew-story&amp;source=---top_nav_layout_nav-----------------------new_post_topnav-----------"><div class="bf b bg z du fj fk ab q fl fm"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24" aria-label="Write"><path fill="currentColor" d="M14 4a.5.5 0 0 0 0-1zm7 6a.5.5 0 0 0-1 0zm-7-7H4v1h10zM3 4v16h1V4zm1 17h16v-1H4zm17-1V10h-1v10zm-1 1a1 1 0 0 0 1-1h-1zM3 20a1 1 0 0 0 1 1v-1zM4 3a1 1 0 0 0-1 1h1z"></path><path stroke="currentColor" d="m17.5 4.5-8.458 8.458a.25.25 0 0 0-.06.098l-.824 2.47a.25.25 0 0 0 .316.316l2.47-.823a.25.25 0 0 0 .098-.06L19.5 6.5m-2-2 2.323-2.323a.25.25 0 0 1 .354 0l1.646 1.646a.25.25 0 0 1 0 .354L19.5 6.5m-2-2 2 2"></path></svg><div class="dt l">Write</div></div></a></span></div></div><div class="k j i d"><div class="fi ab"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="headerSearchButton" rel="noopener follow" href="/search?source=---top_nav_layout_nav----------------------------------"><div class="bf b bg z du fj fk ab q fl fm"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24" aria-label="Search"><path fill="currentColor" fill-rule="evenodd" d="M4.092 11.06a6.95 6.95 0 1 1 13.9 0 6.95 6.95 0 0 1-13.9 0m6.95-8.05a8.05 8.05 0 1 0 5.13 14.26l3.75 3.75a.56.56 0 1 0 .79-.79l-3.73-3.73A8.05 8.05 0 0 0 11.042 3z" clip-rule="evenodd"></path></svg></div></a></div></div><div class="fi h k j"><div class="ab q"><p class="bf b dx dy dz ea eb ec ed ee ef eg du"><span><button class="bf b dx dy eh dz ea ei eb ec ej ek ee el em eg eo ep eq er es et eu ev ew ex ey ez fa fb fc fd bm fe ff" data-testid="headerSignUpButton">Sign up</button></span></p><div class="ax l"><p class="bf b dx dy dz ea eb ec ed ee ef eg du"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="headerSignInButton" rel="noopener follow" href="/m/signin?operation=login&amp;redirect=https%3A%2F%2Fmedium.com%2F%40samarthbnsl%2Fthe-easiest-way-to-understand-and-use-coroutines-in-kotlin-5c2301120952&amp;source=post_page---top_nav_layout_nav-----------------------global_nav-----------">Sign in</a></span></p></div></div></div><div class="l" aria-hidden="false"><button class="ay fn am ab q ao fo fp fq" aria-label="user options menu" data-testid="headerUserIcon"><div class="l fj"><img alt="" class="l fd by bz ca cx" src="https://miro.medium.com/v2/resize:fill:64:64/1*dmbNkD5D-u45r44go_cf0g.png" width="32" height="32" loading="lazy" role="presentation"/><div class="fr by l bz ca fs n ay ft"></div></div></button></div></div></div><div class="l"><div class="fu fv fw fx fy l"><div class="ab cb"><div class="ci bh fz ga gb gc"></div></div><article><div class="l"><div class="l"><span class="l"></span><section><div><div class="fs gi gj gk gl gm"></div><div class="gn go gp gq gr"><div class="ab cb"><div class="ci bh fz ga gb gc"><div><h1 id="797f" class="pw-post-title gs gt gu bf gv gw gx gy gz ha hb hc hd he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu bk" data-testid="storyTitle">The easiest way to understand and use Coroutines in Kotlin</h1><div><div class="speechify-ignore ab cp"><div class="speechify-ignore bh l"><div class="hv hw hx hy hz ab"><div><div class="ab ia"><div><div class="bm" aria-hidden="false"><a rel="noopener follow" href="/@samarthbnsl?source=post_page---byline--5c2301120952--------------------------------"><div class="l ib ic by id ie"><div class="l fj"><img alt="Samarthbnsl" class="l fd by dd de cx" src="https://miro.medium.com/v2/da:true/resize:fill:88:88/0*UxPdIIrJTIaAso0N" width="44" height="44" loading="lazy" data-testid="authorPhoto"/><div class="if by l dd de fs n ig ft"></div></div></div></a></div></div></div></div><div class="bn bh l"><div class="ab"><div style="flex:1"><span class="bf b bg z bk"><div class="ih ab q"><div class="ab q ii"><div class="ab q"><div><div class="bm" aria-hidden="false"><p class="bf b ij ik bk"><a class="af ag ah ai aj ak al am an ao ap aq ar il" data-testid="authorName" rel="noopener follow" href="/@samarthbnsl?source=post_page---byline--5c2301120952--------------------------------">Samarthbnsl</a></p></div></div></div><span class="im in" aria-hidden="true"><span class="bf b bg z du">·</span></span><p class="bf b ij ik du"><span><a class="io ip ah ai aj ak al am an ao ap aq ar ex iq ir" rel="noopener follow" href="/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fsubscribe%2Fuser%2F553500af8d18&amp;operation=register&amp;redirect=https%3A%2F%2Fmedium.com%2F%40samarthbnsl%2Fthe-easiest-way-to-understand-and-use-coroutines-in-kotlin-5c2301120952&amp;user=Samarthbnsl&amp;userId=553500af8d18&amp;source=post_page-553500af8d18--byline--5c2301120952---------------------post_header-----------">Follow</a></span></p></div></div></span></div></div><div class="l is"><span class="bf b bg z du"><div class="ab cn it iu iv"><span class="bf b bg z du"><div class="ab ae"><span data-testid="storyReadTime">5 min read</span><div class="iw ix l" aria-hidden="true"><span class="l" aria-hidden="true"><span class="bf b bg z du">·</span></span></div>8 hours ago</div></span></div></span></div></div></div><div class="ab cp iy iz ja jb jc jd je jf jg jh ji jj jk jl jm jn"><div class="h k w fg fh q"><div class="kd l"><div class="ab q ke kf"><div class="pw-multi-vote-icon fj kg kh ki kj"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="headerClapButton" rel="noopener follow" href="/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fvote%2Fp%2F5c2301120952&amp;operation=register&amp;redirect=https%3A%2F%2Fmedium.com%2F%40samarthbnsl%2Fthe-easiest-way-to-understand-and-use-coroutines-in-kotlin-5c2301120952&amp;user=Samarthbnsl&amp;userId=553500af8d18&amp;source=---header_actions--5c2301120952---------------------clap_footer-----------"><div><div class="bm" aria-hidden="false"><div class="kk ao kl km kn ko am kp kq kr kj"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" aria-label="clap"><path fill-rule="evenodd" d="M11.37.828 12 3.282l.63-2.454zM13.916 3.953l1.523-2.112-1.184-.39zM8.589 1.84l1.522 2.112-.337-2.501zM18.523 18.92c-.86.86-1.75 1.246-2.62 1.33a6 6 0 0 0 .407-.372c2.388-2.389 2.86-4.951 1.399-7.623l-.912-1.603-.79-1.672c-.26-.56-.194-.98.203-1.288a.7.7 0 0 1 .546-.132c.283.046.546.231.728.5l2.363 4.157c.976 1.624 1.141 4.237-1.324 6.702m-10.999-.438L3.37 14.328a.828.828 0 0 1 .585-1.408.83.83 0 0 1 .585.242l2.158 2.157a.365.365 0 0 0 .516-.516l-2.157-2.158-1.449-1.449a.826.826 0 0 1 1.167-1.17l3.438 3.44a.363.363 0 0 0 .516 0 .364.364 0 0 0 0-.516L5.293 9.513l-.97-.97a.826.826 0 0 1 0-1.166.84.84 0 0 1 1.167 0l.97.968 3.437 3.436a.36.36 0 0 0 .517 0 .366.366 0 0 0 0-.516L6.977 7.83a.82.82 0 0 1-.241-.584.82.82 0 0 1 .824-.826c.219 0 .43.087.584.242l5.787 5.787a.366.366 0 0 0 .587-.415l-1.117-2.363c-.26-.56-.194-.98.204-1.289a.7.7 0 0 1 .546-.132c.283.046.545.232.727.501l2.193 3.86c1.302 2.38.883 4.59-1.277 6.75-1.156 1.156-2.602 1.627-4.19 1.367-1.418-.236-2.866-1.033-4.079-2.246M10.75 5.971l2.12 2.12c-.41.502-.465 1.17-.128 1.89l.22.465-3.523-3.523a.8.8 0 0 1-.097-.368c0-.22.086-.428.241-.584a.847.847 0 0 1 1.167 0m7.355 1.705c-.31-.461-.746-.758-1.23-.837a1.44 1.44 0 0 0-1.11.275c-.312.24-.505.543-.59.881a1.74 1.74 0 0 0-.906-.465 1.47 1.47 0 0 0-.82.106l-2.182-2.182a1.56 1.56 0 0 0-2.2 0 1.54 1.54 0 0 0-.396.701 1.56 1.56 0 0 0-2.21-.01 1.55 1.55 0 0 0-.416.753c-.624-.624-1.649-.624-2.237-.037a1.557 1.557 0 0 0 0 2.2c-.239.1-.501.238-.715.453a1.56 1.56 0 0 0 0 2.2l.516.515a1.556 1.556 0 0 0-.753 2.615L7.01 19c1.32 1.319 2.909 2.189 4.475 2.449q.482.08.971.08c.85 0 1.653-.198 2.393-.579.231.033.46.054.686.054 1.266 0 2.457-.52 3.505-1.567 2.763-2.763 2.552-5.734 1.439-7.586z" clip-rule="evenodd"></path></svg></div></div></div></a></span></div><div class="pw-multi-vote-count l ks kt ku kv kw kx ky"><p class="bf b dv z du"><span class="kz">--</span></p></div></div></div><div><div class="bm" aria-hidden="false"><button class="ao kk la lb ab q fk lc ld" aria-label="responses"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" class="le"><path d="M18.006 16.803c1.533-1.456 2.234-3.325 2.234-5.321C20.24 7.357 16.709 4 12.191 4S4 7.357 4 11.482c0 4.126 3.674 7.482 8.191 7.482.817 0 1.622-.111 2.393-.327.231.2.48.391.744.559 1.06.693 2.203 1.044 3.399 1.044.224-.008.4-.112.486-.287a.49.49 0 0 0-.042-.518c-.495-.67-.845-1.364-1.04-2.057a4 4 0 0 1-.125-.598zm-3.122 1.055-.067-.223-.315.096a8 8 0 0 1-2.311.338c-4.023 0-7.292-2.955-7.292-6.587 0-3.633 3.269-6.588 7.292-6.588 4.014 0 7.112 2.958 7.112 6.593 0 1.794-.608 3.469-2.027 4.72l-.195.168v.255c0 .056 0 .151.016.295.025.231.081.478.154.733.154.558.398 1.117.722 1.659a5.3 5.3 0 0 1-2.165-.845c-.276-.176-.714-.383-.941-.59z"></path></svg></button></div></div></div><div class="ab q jo jp jq jr js jt ju jv jw jx jy jz ka kb kc"><div class="lf k j i d"></div><div class="h k"><div><div class="bm" aria-hidden="false"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="headerBookmarkButton" rel="noopener follow" href="/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fbookmark%2Fp%2F5c2301120952&amp;operation=register&amp;redirect=https%3A%2F%2Fmedium.com%2F%40samarthbnsl%2Fthe-easiest-way-to-understand-and-use-coroutines-in-kotlin-5c2301120952&amp;source=---header_actions--5c2301120952---------------------bookmark_footer-----------"><svg xmlns="http://www.w3.org/2000/svg" width="25" height="25" fill="none" viewBox="0 0 25 25" class="du lg" aria-label="Add to list bookmark button"><path fill="currentColor" d="M18 2.5a.5.5 0 0 1 1 0V5h2.5a.5.5 0 0 1 0 1H19v2.5a.5.5 0 1 1-1 0V6h-2.5a.5.5 0 0 1 0-1H18zM7 7a1 1 0 0 1 1-1h3.5a.5.5 0 0 0 0-1H8a2 2 0 0 0-2 2v14a.5.5 0 0 0 .805.396L12.5 17l5.695 4.396A.5.5 0 0 0 19 21v-8.5a.5.5 0 0 0-1 0v7.485l-5.195-4.012a.5.5 0 0 0-.61 0L7 19.985z"></path></svg></a></span></div></div></div><div class="fd lh cn"><div class="l ae"><div class="ab cb"><div class="li lj lk ll lm ln ci bh"><div class="ab"><div class="bm bh" aria-hidden="false"><div><div class="bm" aria-hidden="false"><button aria-label="Listen" data-testid="audioPlayButton" class="af fk ah ai aj ak al lo an ao ap ex lp lq ld lr ls lt lu lv s lw lx ly lz ma mb mc u md me mf"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M3 12a9 9 0 1 1 18 0 9 9 0 0 1-18 0m9-10C6.477 2 2 6.477 2 12s4.477 10 10 10 10-4.477 10-10S17.523 2 12 2m3.376 10.416-4.599 3.066a.5.5 0 0 1-.777-.416V8.934a.5.5 0 0 1 .777-.416l4.599 3.066a.5.5 0 0 1 0 .832" clip-rule="evenodd"></path></svg><div class="j i d"><p class="bf b bg z du">Listen</p></div></button></div></div></div></div></div></div></div></div><div class="bm" aria-hidden="false" aria-describedby="postFooterSocialMenu" aria-labelledby="postFooterSocialMenu"><div><div class="bm" aria-hidden="false"><button aria-controls="postFooterSocialMenu" aria-expanded="false" aria-label="Share Post" data-testid="headerSocialShareButton" class="af fk ah ai aj ak al lo an ao ap ex lp lq ld lr ls lt lu lv s lw lx ly lz ma mb mc u md me mf"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M15.218 4.931a.4.4 0 0 1-.118.132l.012.006a.45.45 0 0 1-.292.074.5.5 0 0 1-.3-.13l-2.02-2.02v7.07c0 .28-.23.5-.5.5s-.5-.22-.5-.5v-7.04l-2 2a.45.45 0 0 1-.57.04h-.02a.4.4 0 0 1-.16-.3.4.4 0 0 1 .1-.32l2.8-2.8a.5.5 0 0 1 .7 0l2.8 2.79a.42.42 0 0 1 .068.498m-.106.138.008.004v-.01zM16 7.063h1.5a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2h-11c-1.1 0-2-.9-2-2v-10a2 2 0 0 1 2-2H8a.5.5 0 0 1 .35.15.5.5 0 0 1 .15.35.5.5 0 0 1-.15.35.5.5 0 0 1-.35.15H6.4c-.5 0-.9.4-.9.9v10.2a.9.9 0 0 0 .9.9h11.2c.5 0 .9-.4.9-.9v-10.2c0-.5-.4-.9-.9-.9H16a.5.5 0 0 1 0-1" clip-rule="evenodd"></path></svg><div class="j i d"><p class="bf b bg z du">Share</p></div></button></div></div></div></div></div></div></div></div></div><figure class="mj mk ml mm mn mo mg mh paragraph-image"><div class="mg mh mi"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/1*JzBLUyeJjZwTxaFLbACO9A.png 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/1*JzBLUyeJjZwTxaFLbACO9A.png 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/1*JzBLUyeJjZwTxaFLbACO9A.png 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/1*JzBLUyeJjZwTxaFLbACO9A.png 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/1*JzBLUyeJjZwTxaFLbACO9A.png 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/1*JzBLUyeJjZwTxaFLbACO9A.png 1100w, https://miro.medium.com/v2/resize:fit:1140/format:webp/1*JzBLUyeJjZwTxaFLbACO9A.png 1140w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 570px" type="image/webp"/><source data-testid="og" srcSet="https://miro.medium.com/v2/resize:fit:640/1*JzBLUyeJjZwTxaFLbACO9A.png 640w, https://miro.medium.com/v2/resize:fit:720/1*JzBLUyeJjZwTxaFLbACO9A.png 720w, https://miro.medium.com/v2/resize:fit:750/1*JzBLUyeJjZwTxaFLbACO9A.png 750w, https://miro.medium.com/v2/resize:fit:786/1*JzBLUyeJjZwTxaFLbACO9A.png 786w, https://miro.medium.com/v2/resize:fit:828/1*JzBLUyeJjZwTxaFLbACO9A.png 828w, https://miro.medium.com/v2/resize:fit:1100/1*JzBLUyeJjZwTxaFLbACO9A.png 1100w, https://miro.medium.com/v2/resize:fit:1140/1*JzBLUyeJjZwTxaFLbACO9A.png 1140w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 570px"/><img alt="" class="bh ln mp c" width="570" height="195" loading="eager" role="presentation"/></picture></div><figcaption class="mq ff mr mg mh ms mt bf b bg z du">Get started with Kotlin multi-threading concepts</figcaption></figure><p id="d829" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk">As soon as you start building your Android app, you might need to store some data or values that persist locally over time. <strong class="mw gv">Jetpack Compose</strong> offers two solutions for this: <strong class="mw gv"><em class="ns">Room database</em></strong> and <strong class="mw gv"><em class="ns">DataStore.</em></strong></p><p id="1fce" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk"><strong class="mw gv">Room Database</strong>: As the name suggests, this is a SQLite instance of a database stored on your computer that you can use to store and query structured data from your app using <strong class="mw gv">coroutines. </strong>More on this later in the article.</p><p id="28ab" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk"><strong class="mw gv">Datastore: </strong>This allows you to store key-value pairs, a newer version of <a class="af nt" href="https://developer.android.com/reference/kotlin/android/content/SharedPreferences" rel="noopener ugc nofollow" target="_blank"><em class="ns">SharedPreferences</em></a> to store data, consider migrating to DataStore instead.</p><h1 id="22f5" class="nu nv gu bf nw nx ny nz oa ob oc od oe of og oh oi oj ok ol om on oo op oq or bk"><strong class="al">What is coroutine then?</strong></h1><p id="8256" class="pw-post-body-paragraph mu mv gu mw b mx os mz na nb ot nd ne nf ou nh ni nj ov nl nm nn ow np nq nr gn bk">You must have understood why you need persistent storage solutions for your app, then what is <strong class="mw gv"><em class="ns">coroutine</em></strong>, and why you need that.</p><ul class=""><li id="1647" class="mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ox oy oz bk">The answer to that is, if you have worked with APIs or Databases, we know that every query or request that is executed, takes a significant amount of time, and we can not let our main thread wait for the results.</li><li id="d152" class="mu mv gu mw b mx pa mz na nb pb nd ne nf pc nh ni nj pd nl nm nn pe np nq nr ox oy oz bk">Especially in our case, where we have an app, that has UI and a user continues to interact with the app, then it is recommended that the UI should get updated and the phone should continue to respond to the user`s touch irrespective of what is going on in the background.</li></ul><p id="06ff" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk">So the purpose of the <strong class="mw gv"><em class="ns">coroutine</em></strong> is to perform multi-threading in <strong class="mw gv"><em class="ns">Kotlin</em></strong><em class="ns">,</em> more like handling asynchronous and returns the result when it is completed just like how we have <em class="ns">promises</em>, <em class="ns">async</em> and <em class="ns">await</em> in <strong class="mw gv">React</strong>.</p><h1 id="dde7" class="nu nv gu bf nw nx ny nz oa ob oc od oe of og oh oi oj ok ol om on oo op oq or bk">Basic Coroutine concepts and code snippets</h1><p id="c7cd" class="pw-post-body-paragraph mu mv gu mw b mx os mz na nb ot nd ne nf ou nh ni nj ov nl nm nn ow np nq nr gn bk"><strong class="mw gv"><em class="ns">Common terms and keywords to get familiar with:</em></strong></p><ul class=""><li id="a8b6" class="mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ox oy oz bk"><strong class="mw gv">suspend</strong>: this is used to mark a function in kotlin as asynchronous, which means we can start the execution of code block in this function and can continue to other tasks and don’t have to wait for the previous async function to finish execution.</li><li id="6d4a" class="mu mv gu mw b mx pa mz na nb pb nd ne nf pc nh ni nj pd nl nm nn pe np nq nr ox oy oz bk"><strong class="mw gv">runBlocking { }</strong>: this is an async function that can have a call for other suspend functions, and we can directly use it in our code, this is a self-sufficient function to handle all the requirements to execute async functions.</li><li id="89e0" class="mu mv gu mw b mx pa mz na nb pb nd ne nf pc nh ni nj pd nl nm nn pe np nq nr ox oy oz bk"><strong class="mw gv">launch{}</strong>: this is used to launch the async code block inside it, and return so that we can continue the execution of code outside it while code inside it continues to run.</li><li id="1cee" class="mu mv gu mw b mx pa mz na nb pb nd ne nf pc nh ni nj pd nl nm nn pe np nq nr ox oy oz bk"><strong class="mw gv">async{}: </strong>why do we need this if we already have the <em class="ns">suspend</em> keyword, <em class="ns">async</em> helps us identify the function as async that returns some result, whereas <em class="ns">suspend</em> is used to mark the function as suspended</li><li id="baee" class="mu mv gu mw b mx pa mz na nb pb nd ne nf pc nh ni nj pd nl nm nn pe np nq nr ox oy oz bk"><strong class="mw gv">Deferred&lt;T&gt;</strong>: this keyword is optional to use but helps us to identify the variable returned from an <em class="ns">async</em> function</li><li id="8587" class="mu mv gu mw b mx pa mz na nb pb nd ne nf pc nh ni nj pd nl nm nn pe np nq nr ox oy oz bk"><strong class="mw gv">await(): </strong>this waits for the value of the <em class="ns">deferred</em> type object until the <em class="ns">async</em> function is completed and returns the result</li><li id="eb15" class="mu mv gu mw b mx pa mz na nb pb nd ne nf pc nh ni nj pd nl nm nn pe np nq nr ox oy oz bk"><strong class="mw gv">coroutineScope()</strong>: this is used to contain code blocks that can have multiple <em class="ns">coroutine</em> executions running in parallel, but how it is different from <em class="ns">coroutine</em> or<em class="ns"> launch </em>is because, <em class="ns">coroutineScope</em> can be canceled or stopped(due to exceptions), and return only after all the <em class="ns">coroutine</em> inside it has finished</li><li id="bc79" class="mu mv gu mw b mx pa mz na nb pb nd ne nf pc nh ni nj pd nl nm nn pe np nq nr ox oy oz bk"><strong class="mw gv">Job</strong>: as you have observed the <em class="ns">launch</em> returns after starting the execution, then how we can manage the execution of that code, so this <em class="ns">Job </em>helps us to get an instance of the code execution and stop it using <em class="ns">job.cancel()</em></li></ul><p id="df9c" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk">Now we understand all the keywords associated with <em class="ns">Coroutine, </em>let&#x27;s see them used in the actual code picked up from <a class="af nt" href="https://developer.android.com/codelabs/basic-android-kotlin-compose-coroutines-kotlin-playground?continue=https%3A%2F%2Fdeveloper.android.com%2Fcourses%2Fpathways%2Fandroid-basics-compose-unit-5-pathway-1%23codelab-https%3A%2F%2Fdeveloper.android.com%2Fcodelabs%2Fbasic-android-kotlin-compose-coroutines-kotlin-playground#0" rel="noopener ugc nofollow" target="_blank">here</a></p><pre class="pf pg ph pi pj pk pl pm bp pn bb bk"><span id="d108" class="po nv gu pl b bg pp pq l pr ps">import kotlinx.coroutines.*<br/><br/>fun main() {<br/> runBlocking {<br/> println(&quot;Weather forecast&quot;)<br/> println(getWeatherReport())<br/> println(&quot;Have a good day!&quot;)<br/> }<br/>}<br/><br/>suspend fun getWeatherReport() = coroutineScope {<br/> val forecast = async { getForecast() }<br/> val temperature = async { getTemperature() }<br/> &quot;${forecast.await()} ${temperature.await()}&quot;<br/>}<br/><br/>suspend fun getForecast(): String {<br/> delay(1000)<br/> return &quot;Sunny&quot;<br/>}<br/><br/>suspend fun getTemperature(): String {<br/> delay(1000)<br/> return &quot;30\u00b0C&quot;<br/>}</span></pre><p id="7348" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk">Breaking down the code:</p><ul class=""><li id="c079" class="mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ox oy oz bk"><strong class="mw gv"><em class="ns">getForecast() </em></strong>and <strong class="mw gv"><em class="ns">getTemperature(): </em></strong>are created with the <em class="ns">suspend </em>keyword to mark it as a time-taking function and run on other thread</li><li id="7dd4" class="mu mv gu mw b mx pa mz na nb pb nd ne nf pc nh ni nj pd nl nm nn pe np nq nr ox oy oz bk"><strong class="mw gv"><em class="ns">getWeatherReport():</em></strong> a <em class="ns">coroutineScope </em>is created that contains <strong class="mw gv">2 <em class="ns">async</em> </strong>functions, so it will start the execution of the first <em class="ns">async function</em>, then move to the second <em class="ns">async function </em>to start its execution, and then when it arrives at 3rd line, then it will wait for forecast and temperature to return the value (that also means that async functions have completed), so <strong class="mw gv"><em class="ns">coroutineScope</em></strong> will be completed and return.</li><li id="b9de" class="mu mv gu mw b mx pa mz na nb pb nd ne nf pc nh ni nj pd nl nm nn pe np nq nr ox oy oz bk"><strong class="mw gv">runBlocking()</strong>: this will contain <em class="ns">sync</em> as well as <em class="ns">suspend functions</em> and start its execution in order.</li></ul><p id="97e8" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk">Here is the output of the above function:</p><pre class="pf pg ph pi pj pk pl pm bp pn bb bk"><span id="0d85" class="po nv gu pl b bg pp pq l pr ps">Weather forecast<br/>Sunny 30°C<br/>Have a good day!</span></pre><h2 id="427c" class="pt nv gu bf nw pu pv dy oa pw px ea oe nf py pz qa nj qb qc qd nn qe qf qg qh bk">Extra brownie points</h2><ul class=""><li id="0f76" class="mu mv gu mw b mx os mz na nb ot nd ne nf ou nh ni nj ov nl nm nn ow np nq nr ox oy oz bk">A <em class="ns">coroutineScope</em> will be returned if and only if all the <em class="ns">coroutine</em> launched inside have been completed or canceled (if some throw an exception or explicitly canceled) like the following example code block</li></ul><pre class="pf pg ph pi pj pk pl pm bp pn bb bk"><span id="5896" class="po nv gu pl b bg pp pq l pr ps">...<br/><br/>suspend fun getWeatherReport() = coroutineScope {<br/> val forecast = async { getForecast() }<br/> val temperature = async { getTemperature() }<br/> <br/> delay(200)<br/> temperature.cancel()<br/><br/> &quot;${forecast.await()}&quot;<br/>}<br/><br/>...<br/><br/><br/>//Output <br/>Weather forecast<br/>Sunny<br/>Have a good day!</span></pre><ul class=""><li id="9f83" class="mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ox oy oz bk">how to handle the execution launched by <em class="ns">launch</em> keyword, by using its instance in a variable as <strong class="mw gv"><em class="ns">Job</em></strong>, this can contain a <em class="ns">coroutine </em>that can itself have another <em class="ns">coroutine</em> inside it (kind of parent-child relationships), so when we cancel a <em class="ns">parent coroutine, </em>it cancels all the child coroutine also</li></ul><pre class="pf pg ph pi pj pk pl pm bp pn bb bk"><span id="ceda" class="po nv gu pl b bg pp pq l pr ps">val job = launch {<br/> ... <br/><br/> val childJob = launch { ... }<br/><br/> ...<br/>}<br/><br/>...<br/><br/>//cancelled using <br/><br/>job.cancel()</span></pre><ul class=""><li id="9fe9" class="mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ox oy oz bk">A particular <em class="ns">coroutine</em> can be identified using, all its information about the <em class="ns">context</em> in which the <em class="ns">coroutine</em> is running in is:</li></ul><pre class="pf pg ph pi pj pk pl pm bp pn bb bk"><span id="2124" class="po nv gu pl b bg pp pq l pr ps">CouroutineContext = Job() + Dispatchers.Main + exceptionHandler</span></pre><ul class=""><li id="a8b9" class="mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ox oy oz bk">We can choose where to execute our blocking code away from the <strong class="mw gv"><em class="ns">main</em></strong> thread, kotlin provides 3 types of Dispatchers: <em class="ns">Dispatchers.Main</em>, <em class="ns">Dispatchers.IO, Dispatchers.Default. </em>Dispatchers mean a thread can be started, does some work (executes some code), and then terminates when there’s no more work to be done, example below</li></ul><pre class="pf pg ph pi pj pk pl pm bp pn bb bk"><span id="cf29" class="po nv gu pl b bg pp pq l pr ps">import kotlinx.coroutines.*<br/><br/>fun main() {<br/> runBlocking {<br/> println(&quot;${Thread.currentThread().name} - runBlocking function&quot;)<br/> launch {<br/> println(&quot;${Thread.currentThread().name} - launch function&quot;)<br/> withContext(Dispatchers.Default) {<br/> println(&quot;${Thread.currentThread().name} - withContext function&quot;)<br/> delay(1000)<br/> println(&quot;10 results found.&quot;)<br/> }<br/> println(&quot;${Thread.currentThread().name} - end of launch function&quot;)<br/> }<br/> println(&quot;Loading...&quot;)<br/> }<br/>}<br/><br/><br/>//Output<br/><br/>main @coroutine#1 - runBlocking function<br/>Loading...<br/>main @coroutine#2 - launch function<br/>DefaultDispatcher-worker-1 @coroutine#2 - withContext function<br/>10 results found.<br/>main @coroutine#2 - end of launch function</span></pre><h2 id="34b5" class="pt nv gu bf nw pu pv dy oa pw px ea oe nf py pz qa nj qb qc qd nn qe qf qg qh bk">Summary</h2><p id="836b" class="pw-post-body-paragraph mu mv gu mw b mx os mz na nb ot nd ne nf ou nh ni nj ov nl nm nn ow np nq nr gn bk">In conclusion, the coroutine is a powerful tool for writing async code that is a necessity when we write Networking code or Database queries. Hope you have an understanding of the <em class="ns">coroutine</em>, follow this article on how to create a <strong class="mw gv">Room database</strong> and write operations using the <em class="ns">coroutine</em>.</p><p id="2ab5" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk">Happy Coding!!!</p><p id="ff8e" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk">Please don’t forget to give claps 👏 and share this with your fellow coder friends.</p><blockquote class="qi qj qk"><p id="c924" class="mu mv ns mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk"><a class="af nt" href="https://github.com/imsamrth" rel="noopener ugc nofollow" target="_blank"><strong class="mw gv">Follow me</strong></a><strong class="mw gv"> to look into other repos covering new concepts in all the programming language</strong></p></blockquote></div></div></div></div></section></div></div></article></div><div class="ab cb"><div class="ci bh fz ga gb gc"><div class="ql qm ab iv"><div class="qn ab"><a class="qo ay am ao" rel="noopener follow" href="/tag/kotlin-beginners?source=post_page-----5c2301120952--------------------------------"><div class="qp fj cx qq ge qr qs bf b bg z bk qt">Kotlin Beginners</div></a></div><div class="qn ab"><a class="qo ay am ao" rel="noopener follow" href="/tag/kotlin-coroutines?source=post_page-----5c2301120952--------------------------------"><div class="qp fj cx qq ge qr qs bf b bg z bk qt">Kotlin Coroutines</div></a></div><div class="qn ab"><a class="qo ay am ao" rel="noopener follow" href="/tag/android?source=post_page-----5c2301120952--------------------------------"><div class="qp fj cx qq ge qr qs bf b bg z bk qt">Android</div></a></div><div class="qn ab"><a class="qo ay am ao" rel="noopener follow" href="/tag/room-database?source=post_page-----5c2301120952--------------------------------"><div class="qp fj cx qq ge qr qs bf b bg z bk qt">Room Database</div></a></div><div class="qn ab"><a class="qo ay am ao" rel="noopener follow" href="/tag/2025?source=post_page-----5c2301120952--------------------------------"><div class="qp fj cx qq ge qr qs bf b bg z bk qt">2025</div></a></div></div></div></div><div class="l"></div><footer class="qu qv qw qx qy ab q qz ra c"><div class="l ae"><div class="ab cb"><div class="ci bh fz ga gb gc"><div class="ab cp rb"><div class="ab q ke"><div class="rc l"><span class="l rd re rf e d"><div class="ab q ke kf"><div class="pw-multi-vote-icon fj kg kh ki kj"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="footerClapButton" rel="noopener follow" href="/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fvote%2Fp%2F5c2301120952&amp;operation=register&amp;redirect=https%3A%2F%2Fmedium.com%2F%40samarthbnsl%2Fthe-easiest-way-to-understand-and-use-coroutines-in-kotlin-5c2301120952&amp;user=Samarthbnsl&amp;userId=553500af8d18&amp;source=---footer_actions--5c2301120952---------------------clap_footer-----------"><div><div class="bm" aria-hidden="false"><div class="kk ao kl km kn ko am kp kq kr kj"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" aria-label="clap"><path fill-rule="evenodd" d="M11.37.828 12 3.282l.63-2.454zM13.916 3.953l1.523-2.112-1.184-.39zM8.589 1.84l1.522 2.112-.337-2.501zM18.523 18.92c-.86.86-1.75 1.246-2.62 1.33a6 6 0 0 0 .407-.372c2.388-2.389 2.86-4.951 1.399-7.623l-.912-1.603-.79-1.672c-.26-.56-.194-.98.203-1.288a.7.7 0 0 1 .546-.132c.283.046.546.231.728.5l2.363 4.157c.976 1.624 1.141 4.237-1.324 6.702m-10.999-.438L3.37 14.328a.828.828 0 0 1 .585-1.408.83.83 0 0 1 .585.242l2.158 2.157a.365.365 0 0 0 .516-.516l-2.157-2.158-1.449-1.449a.826.826 0 0 1 1.167-1.17l3.438 3.44a.363.363 0 0 0 .516 0 .364.364 0 0 0 0-.516L5.293 9.513l-.97-.97a.826.826 0 0 1 0-1.166.84.84 0 0 1 1.167 0l.97.968 3.437 3.436a.36.36 0 0 0 .517 0 .366.366 0 0 0 0-.516L6.977 7.83a.82.82 0 0 1-.241-.584.82.82 0 0 1 .824-.826c.219 0 .43.087.584.242l5.787 5.787a.366.366 0 0 0 .587-.415l-1.117-2.363c-.26-.56-.194-.98.204-1.289a.7.7 0 0 1 .546-.132c.283.046.545.232.727.501l2.193 3.86c1.302 2.38.883 4.59-1.277 6.75-1.156 1.156-2.602 1.627-4.19 1.367-1.418-.236-2.866-1.033-4.079-2.246M10.75 5.971l2.12 2.12c-.41.502-.465 1.17-.128 1.89l.22.465-3.523-3.523a.8.8 0 0 1-.097-.368c0-.22.086-.428.241-.584a.847.847 0 0 1 1.167 0m7.355 1.705c-.31-.461-.746-.758-1.23-.837a1.44 1.44 0 0 0-1.11.275c-.312.24-.505.543-.59.881a1.74 1.74 0 0 0-.906-.465 1.47 1.47 0 0 0-.82.106l-2.182-2.182a1.56 1.56 0 0 0-2.2 0 1.54 1.54 0 0 0-.396.701 1.56 1.56 0 0 0-2.21-.01 1.55 1.55 0 0 0-.416.753c-.624-.624-1.649-.624-2.237-.037a1.557 1.557 0 0 0 0 2.2c-.239.1-.501.238-.715.453a1.56 1.56 0 0 0 0 2.2l.516.515a1.556 1.556 0 0 0-.753 2.615L7.01 19c1.32 1.319 2.909 2.189 4.475 2.449q.482.08.971.08c.85 0 1.653-.198 2.393-.579.231.033.46.054.686.054 1.266 0 2.457-.52 3.505-1.567 2.763-2.763 2.552-5.734 1.439-7.586z" clip-rule="evenodd"></path></svg></div></div></div></a></span></div><div class="pw-multi-vote-count l ks kt ku kv kw kx ky"><p class="bf b dv z du"><span class="kz">--</span></p></div></div></span><span class="l h g f rg rh"><div class="ab q ke kf"><div class="pw-multi-vote-icon fj kg kh ki kj"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="footerClapButton" rel="noopener follow" href="/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fvote%2Fp%2F5c2301120952&amp;operation=register&amp;redirect=https%3A%2F%2Fmedium.com%2F%40samarthbnsl%2Fthe-easiest-way-to-understand-and-use-coroutines-in-kotlin-5c2301120952&amp;user=Samarthbnsl&amp;userId=553500af8d18&amp;source=---footer_actions--5c2301120952---------------------clap_footer-----------"><div><div class="bm" aria-hidden="false"><div class="kk ao kl km kn ko am kp kq kr kj"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" aria-label="clap"><path fill-rule="evenodd" d="M11.37.828 12 3.282l.63-2.454zM13.916 3.953l1.523-2.112-1.184-.39zM8.589 1.84l1.522 2.112-.337-2.501zM18.523 18.92c-.86.86-1.75 1.246-2.62 1.33a6 6 0 0 0 .407-.372c2.388-2.389 2.86-4.951 1.399-7.623l-.912-1.603-.79-1.672c-.26-.56-.194-.98.203-1.288a.7.7 0 0 1 .546-.132c.283.046.546.231.728.5l2.363 4.157c.976 1.624 1.141 4.237-1.324 6.702m-10.999-.438L3.37 14.328a.828.828 0 0 1 .585-1.408.83.83 0 0 1 .585.242l2.158 2.157a.365.365 0 0 0 .516-.516l-2.157-2.158-1.449-1.449a.826.826 0 0 1 1.167-1.17l3.438 3.44a.363.363 0 0 0 .516 0 .364.364 0 0 0 0-.516L5.293 9.513l-.97-.97a.826.826 0 0 1 0-1.166.84.84 0 0 1 1.167 0l.97.968 3.437 3.436a.36.36 0 0 0 .517 0 .366.366 0 0 0 0-.516L6.977 7.83a.82.82 0 0 1-.241-.584.82.82 0 0 1 .824-.826c.219 0 .43.087.584.242l5.787 5.787a.366.366 0 0 0 .587-.415l-1.117-2.363c-.26-.56-.194-.98.204-1.289a.7.7 0 0 1 .546-.132c.283.046.545.232.727.501l2.193 3.86c1.302 2.38.883 4.59-1.277 6.75-1.156 1.156-2.602 1.627-4.19 1.367-1.418-.236-2.866-1.033-4.079-2.246M10.75 5.971l2.12 2.12c-.41.502-.465 1.17-.128 1.89l.22.465-3.523-3.523a.8.8 0 0 1-.097-.368c0-.22.086-.428.241-.584a.847.847 0 0 1 1.167 0m7.355 1.705c-.31-.461-.746-.758-1.23-.837a1.44 1.44 0 0 0-1.11.275c-.312.24-.505.543-.59.881a1.74 1.74 0 0 0-.906-.465 1.47 1.47 0 0 0-.82.106l-2.182-2.182a1.56 1.56 0 0 0-2.2 0 1.54 1.54 0 0 0-.396.701 1.56 1.56 0 0 0-2.21-.01 1.55 1.55 0 0 0-.416.753c-.624-.624-1.649-.624-2.237-.037a1.557 1.557 0 0 0 0 2.2c-.239.1-.501.238-.715.453a1.56 1.56 0 0 0 0 2.2l.516.515a1.556 1.556 0 0 0-.753 2.615L7.01 19c1.32 1.319 2.909 2.189 4.475 2.449q.482.08.971.08c.85 0 1.653-.198 2.393-.579.231.033.46.054.686.054 1.266 0 2.457-.52 3.505-1.567 2.763-2.763 2.552-5.734 1.439-7.586z" clip-rule="evenodd"></path></svg></div></div></div></a></span></div><div class="pw-multi-vote-count l ks kt ku kv kw kx ky"><p class="bf b dv z du"><span class="kz">--</span></p></div></div></span></div><div class="bq ab"><div><div class="bm" aria-hidden="false"><button class="ao kk la lb ab q fk lc ld" aria-label="responses"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" class="le"><path d="M18.006 16.803c1.533-1.456 2.234-3.325 2.234-5.321C20.24 7.357 16.709 4 12.191 4S4 7.357 4 11.482c0 4.126 3.674 7.482 8.191 7.482.817 0 1.622-.111 2.393-.327.231.2.48.391.744.559 1.06.693 2.203 1.044 3.399 1.044.224-.008.4-.112.486-.287a.49.49 0 0 0-.042-.518c-.495-.67-.845-1.364-1.04-2.057a4 4 0 0 1-.125-.598zm-3.122 1.055-.067-.223-.315.096a8 8 0 0 1-2.311.338c-4.023 0-7.292-2.955-7.292-6.587 0-3.633 3.269-6.588 7.292-6.588 4.014 0 7.112 2.958 7.112 6.593 0 1.794-.608 3.469-2.027 4.72l-.195.168v.255c0 .056 0 .151.016.295.025.231.081.478.154.733.154.558.398 1.117.722 1.659a5.3 5.3 0 0 1-2.165-.845c-.276-.176-.714-.383-.941-.59z"></path></svg></button></div></div></div></div><div class="ab q"><div class="ri l is"><div><div class="bm" aria-hidden="false"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="footerBookmarkButton" rel="noopener follow" href="/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fbookmark%2Fp%2F5c2301120952&amp;operation=register&amp;redirect=https%3A%2F%2Fmedium.com%2F%40samarthbnsl%2Fthe-easiest-way-to-understand-and-use-coroutines-in-kotlin-5c2301120952&amp;source=---footer_actions--5c2301120952---------------------bookmark_footer-----------"><svg xmlns="http://www.w3.org/2000/svg" width="25" height="25" fill="none" viewBox="0 0 25 25" class="du lg" aria-label="Add to list bookmark button"><path fill="currentColor" d="M18 2.5a.5.5 0 0 1 1 0V5h2.5a.5.5 0 0 1 0 1H19v2.5a.5.5 0 1 1-1 0V6h-2.5a.5.5 0 0 1 0-1H18zM7 7a1 1 0 0 1 1-1h3.5a.5.5 0 0 0 0-1H8a2 2 0 0 0-2 2v14a.5.5 0 0 0 .805.396L12.5 17l5.695 4.396A.5.5 0 0 0 19 21v-8.5a.5.5 0 0 0-1 0v7.485l-5.195-4.012a.5.5 0 0 0-.61 0L7 19.985z"></path></svg></a></span></div></div></div><div class="ri l is"><div class="bm" aria-hidden="false" aria-describedby="postFooterSocialMenu" aria-labelledby="postFooterSocialMenu"><div><div class="bm" aria-hidden="false"><button aria-controls="postFooterSocialMenu" aria-expanded="false" aria-label="Share Post" data-testid="footerSocialShareButton" class="af fk ah ai aj ak al lo an ao ap ex lp lq ld lr"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M15.218 4.931a.4.4 0 0 1-.118.132l.012.006a.45.45 0 0 1-.292.074.5.5 0 0 1-.3-.13l-2.02-2.02v7.07c0 .28-.23.5-.5.5s-.5-.22-.5-.5v-7.04l-2 2a.45.45 0 0 1-.57.04h-.02a.4.4 0 0 1-.16-.3.4.4 0 0 1 .1-.32l2.8-2.8a.5.5 0 0 1 .7 0l2.8 2.79a.42.42 0 0 1 .068.498m-.106.138.008.004v-.01zM16 7.063h1.5a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2h-11c-1.1 0-2-.9-2-2v-10a2 2 0 0 1 2-2H8a.5.5 0 0 1 .35.15.5.5 0 0 1 .15.35.5.5 0 0 1-.15.35.5.5 0 0 1-.35.15H6.4c-.5 0-.9.4-.9.9v10.2a.9.9 0 0 0 .9.9h11.2c.5 0 .9-.4.9-.9v-10.2c0-.5-.4-.9-.9-.9H16a.5.5 0 0 1 0-1" clip-rule="evenodd"></path></svg></button></div></div></div></div></div></div></div></div></div></footer><div class="rj rk rl rm rn l"><div class="ab cb"><div class="ci bh fz ga gb gc"><div class="ro bh r rp"></div><div class="ab rq rr rs iu it"><div class="rt ru rv rw rx ry rz sa sb sc ab cp"><div class="h k"><a tabindex="0" rel="noopener follow" href="/@samarthbnsl?source=post_page---post_author_info--5c2301120952--------------------------------"><div class="l fj"><img alt="Samarthbnsl" class="l fd by ic ib cx" src="https://miro.medium.com/v2/resize:fill:96:96/0*UxPdIIrJTIaAso0N" width="48" height="48" loading="lazy"/><div class="fr by l ic ib fs n ay sd"></div></div></a></div><div class="j i d"><a tabindex="0" rel="noopener follow" href="/@samarthbnsl?source=post_page---post_author_info--5c2301120952--------------------------------"><div class="l fj"><img alt="Samarthbnsl" class="l fd by se sf cx" src="https://miro.medium.com/v2/resize:fill:128:128/0*UxPdIIrJTIaAso0N" width="64" height="64" loading="lazy"/><div class="fr by l se sf fs n ay sd"></div></div></a></div><div class="j i d sg is"><div class="ab"><span><button class="bf b bg z sh qp si sj sk sl sm ev ew sn so sp fa fb fc fd bm fe ff">Follow</button></span></div></div></div><div class="ab co sq"><div class="sr ss st su sv l"><a class="af ag ah aj ak al am an ao ap aq ar as at ab q" rel="noopener follow" href="/@samarthbnsl?source=post_page---post_author_info--5c2301120952--------------------------------"><h2 class="pw-author-name bf sx sy sz ta tb tc td nf pz qa nj qc qd nn qf qg bk"><span class="gn sw">Written by <!-- -->Samarthbnsl</span></h2></a><div class="qn ab ia"><div class="l is"><span class="pw-follower-count bf b bg z du"><a class="af ag ah ai aj ak al am an ao ap aq ar il" rel="noopener follow" href="/@samarthbnsl/followers?source=post_page---post_author_info--5c2301120952--------------------------------">1 Follower</a></span></div><div class="bf b bg z du ab te"><span class="im l" aria-hidden="true"><span class="bf b bg z du">·</span></span><a class="af ag ah ai aj ak al am an ao ap aq ar il" rel="noopener follow" href="/@samarthbnsl/following?source=post_page---post_author_info--5c2301120952--------------------------------">1 Following</a></div></div><div class="tf l"></div></div></div><div class="h k"><div class="ab"><span><button class="bf b bg z sh qp si sj sk sl sm ev ew sn so sp fa fb fc fd bm fe ff">Follow</button></span></div></div></div></div></div></div><div class="tg l"><div class="ro bh r th ti tj tk tl"></div><div class="ab cb"><div class="ci bh fz ga gb gc"><div class="ab q cp"><h2 class="bf sx nx nz oa ob od oe of oh oi oj ol om on op oq bk">No responses yet</h2><div class="ab tm"><div><div class="bm" aria-hidden="false"><a class="tn to" href="https://policy.medium.com/medium-rules-30e5502c4eb4?source=post_page---post_responses--5c2301120952--------------------------------" rel="noopener follow" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" width="25" height="25" viewBox="0 0 25 25"><path fill-rule="evenodd" d="M11.987 5.036a.754.754 0 0 1 .914-.01c.972.721 1.767 1.218 2.6 1.543.828.322 1.719.485 2.887.505a.755.755 0 0 1 .741.757c-.018 3.623-.43 6.256-1.449 8.21-1.034 1.984-2.662 3.209-4.966 4.083a.75.75 0 0 1-.537-.003c-2.243-.874-3.858-2.095-4.897-4.074-1.024-1.951-1.457-4.583-1.476-8.216a.755.755 0 0 1 .741-.757c1.195-.02 2.1-.182 2.923-.503.827-.322 1.6-.815 2.519-1.535m.468.903c-.897.69-1.717 1.21-2.623 1.564-.898.35-1.856.527-3.026.565.037 3.45.469 5.817 1.36 7.515.884 1.684 2.25 2.762 4.284 3.571 2.092-.81 3.465-1.89 4.344-3.575.886-1.698 1.299-4.065 1.334-7.512-1.149-.039-2.091-.217-2.99-.567-.906-.353-1.745-.873-2.683-1.561m-.009 9.155a2.672 2.672 0 1 0 0-5.344 2.672 2.672 0 0 0 0 5.344m0 1a3.672 3.672 0 1 0 0-7.344 3.672 3.672 0 0 0 0 7.344m-1.813-3.777.525-.526.916.917 1.623-1.625.526.526-2.149 2.152z" clip-rule="evenodd"></path></svg></a></div></div></div></div></div></div></div><div class="tp tq tr ts tt l bx"><div class="h k j"><div class="ro bh tu tv"></div><div class="ab cb"><div class="ci bh fz ga gb gc"><div class="tw ab ke iv"><div class="tx ty l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://help.medium.com/hc/en-us?source=post_page-----5c2301120952--------------------------------" rel="noopener follow"><p class="bf b dv z du">Help</p></a></div><div class="tx ty l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://medium.statuspage.io/?source=post_page-----5c2301120952--------------------------------" rel="noopener follow"><p class="bf b dv z du">Status</p></a></div><div class="tx ty l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" rel="noopener follow" href="/about?autoplay=1&amp;source=post_page-----5c2301120952--------------------------------"><p class="bf b dv z du">About</p></a></div><div class="tx ty l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" rel="noopener follow" href="/jobs-at-medium/work-at-medium-959d1a85284e?source=post_page-----5c2301120952--------------------------------"><p class="bf b dv z du">Careers</p></a></div><div class="tx ty l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="pressinquiries@medium.com?source=post_page-----5c2301120952--------------------------------" rel="noopener follow"><p class="bf b dv z du">Press</p></a></div><div class="tx ty l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://blog.medium.com/?source=post_page-----5c2301120952--------------------------------" rel="noopener follow"><p class="bf b dv z du">Blog</p></a></div><div class="tx ty l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://policy.medium.com/medium-privacy-policy-f03bf92035c9?source=post_page-----5c2301120952--------------------------------" rel="noopener follow"><p class="bf b dv z du">Privacy</p></a></div><div class="tx ty l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://policy.medium.com/medium-terms-of-service-9db0094a1e0f?source=post_page-----5c2301120952--------------------------------" rel="noopener follow"><p class="bf b dv z du">Terms</p></a></div><div class="tx ty l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://speechify.com/medium?source=post_page-----5c2301120952--------------------------------" rel="noopener follow"><p class="bf b dv z du">Text to speech</p></a></div><div class="tx l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" rel="noopener follow" href="/business?source=post_page-----5c2301120952--------------------------------"><p class="bf b dv z du">Teams</p></a></div></div></div></div></div></div></div></div></div></div><script>window.__BUILD_ID__="main-20241122-185319-7bcdc08639"</script><script>window.__GRAPHQL_URI__ = "https://medium.com/_/graphql"</script><script>window.__PRELOADED_STATE__ = {"algolia":{"queries":{}},"cache":{"experimentGroupSet":true,"reason":"","group":"enabled","tags":["group-edgeCachePosts","post-5c2301120952","user-553500af8d18"],"serverVariantState":"44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a","middlewareEnabled":true,"cacheStatus":"DYNAMIC","shouldUseCache":true,"vary":[],"lohpSummerUpsellEnabled":false,"publicationHierarchyEnabledWeb":false,"postBottomResponsesEnabled":false},"client":{"hydrated":false,"isUs":false,"isNativeMedium":false,"isSafariMobile":false,"isSafari":false,"isFirefox":false,"routingEntity":{"type":"DEFAULT","explicit":false},"viewerIsBot":false},"debug":{"requestId":"0b1e09ab-e199-442c-a45b-9d318220607c","hybridDevServices":[],"originalSpanCarrier":{"traceparent":"00-f78c03b34bff8e3f5e2d843aa5fa0f97-8583ed31d629c8b1-01"}},"multiVote":{"clapsPerPost":{}},"navigation":{"branch":{"show":null,"hasRendered":null,"blockedByCTA":false},"hideGoogleOneTap":false,"hasRenderedAlternateUserBanner":null,"currentLocation":"https:\u002F\u002Fmedium.com\u002F@samarthbnsl\u002Fthe-easiest-way-to-understand-and-use-coroutines-in-kotlin-5c2301120952","host":"medium.com","hostname":"medium.com","referrer":"","hasSetReferrer":false,"susiModal":{"step":null,"operation":"register"},"postRead":false,"partnerProgram":{"selectedCountryCode":null},"queryString":"","currentHash":""},"config":{"nodeEnv":"production","version":"main-20241122-185319-7bcdc08639","target":"production","productName":"Medium","publicUrl":"https:\u002F\u002Fcdn-client.medium.com\u002Flite","authDomain":"medium.com","authGoogleClientId":"216296035834-k1k6qe060s2tp2a2jam4ljdcms00sttg.apps.googleusercontent.com","favicon":"production","glyphUrl":"https:\u002F\u002Fglyph.medium.com","branchKey":"key_live_ofxXr2qTrrU9NqURK8ZwEhknBxiI6KBm","algolia":{"appId":"MQ57UUUQZ2","apiKeySearch":"394474ced050e3911ae2249ecc774921","indexPrefix":"medium_","host":"-dsn.algolia.net"},"recaptchaKey":"6Lfc37IUAAAAAKGGtC6rLS13R1Hrw_BqADfS1LRk","recaptcha3Key":"6Lf8R9wUAAAAABMI_85Wb8melS7Zj6ziuf99Yot5","recaptchaEnterpriseKeyId":"6Le-uGgpAAAAAPprRaokM8AKthQ9KNGdoxaGUvVp","datadog":{"applicationId":"6702d87d-a7e0-42fe-bbcb-95b469547ea0","clientToken":"pub853ea8d17ad6821d9f8f11861d23dfed","rumToken":"pubf9cc52896502b9413b68ba36fc0c7162","context":{"deployment":{"target":"production","tag":"main-20241122-185319-7bcdc08639","commit":"7bcdc08639c179dc5172558201a3fd3abc1b5db6"}},"datacenter":"us"},"googleAnalyticsCode":"G-7JY7T788PK","googlePay":{"apiVersion":"2","apiVersionMinor":"0","merchantId":"BCR2DN6TV7EMTGBM","merchantName":"Medium","instanceMerchantId":"13685562959212738550"},"applePay":{"version":3},"signInWallCustomDomainCollectionIds":["3a8144eabfe3","336d898217ee","61061eb0c96b","138adf9c44c","819cc2aaeee0"],"mediumMastodonDomainName":"me.dm","mediumOwnedAndOperatedCollectionIds":["8a9336e5bb4","b7e45b22fec3","193b68bd4fba","8d6b8a439e32","54c98c43354d","3f6ecf56618","d944778ce714","92d2092dc598","ae2a65f35510","1285ba81cada","544c7006046e","fc8964313712","40187e704f1c","88d9857e584e","7b6769f2748b","bcc38c8f6edf","cef6983b292","cb8577c9149e","444d13b52878","713d7dbc99b0","ef8e90590e66","191186aaafa0","55760f21cdc5","9dc80918cc93","bdc4052bbdba","8ccfed20cbb2"],"tierOneDomains":["medium.com","thebolditalic.com","arcdigital.media","towardsdatascience.com","uxdesign.cc","codeburst.io","psiloveyou.xyz","writingcooperative.com","entrepreneurshandbook.co","prototypr.io","betterhumans.coach.me","theascent.pub"],"topicsToFollow":["d61cf867d93f","8a146bc21b28","1eca0103fff3","4d562ee63426","aef1078a3ef5","e15e46793f8d","6158eb913466","55f1c20aba7a","3d18b94f6858","4861fee224fd","63c6f1f93ee","1d98b3a9a871","decb52b64abf","ae5d4995e225","830cded25262"],"topicToTagMappings":{"accessibility":"accessibility","addiction":"addiction","android-development":"android-development","art":"art","artificial-intelligence":"artificial-intelligence","astrology":"astrology","basic-income":"basic-income","beauty":"beauty","biotech":"biotech","blockchain":"blockchain","books":"books","business":"business","cannabis":"cannabis","cities":"cities","climate-change":"climate-change","comics":"comics","coronavirus":"coronavirus","creativity":"creativity","cryptocurrency":"cryptocurrency","culture":"culture","cybersecurity":"cybersecurity","data-science":"data-science","design":"design","digital-life":"digital-life","disability":"disability","economy":"economy","education":"education","equality":"equality","family":"family","feminism":"feminism","fiction":"fiction","film":"film","fitness":"fitness","food":"food","freelancing":"freelancing","future":"future","gadgets":"gadgets","gaming":"gaming","gun-control":"gun-control","health":"health","history":"history","humor":"humor","immigration":"immigration","ios-development":"ios-development","javascript":"javascript","justice":"justice","language":"language","leadership":"leadership","lgbtqia":"lgbtqia","lifestyle":"lifestyle","machine-learning":"machine-learning","makers":"makers","marketing":"marketing","math":"math","media":"media","mental-health":"mental-health","mindfulness":"mindfulness","money":"money","music":"music","neuroscience":"neuroscience","nonfiction":"nonfiction","outdoors":"outdoors","parenting":"parenting","pets":"pets","philosophy":"philosophy","photography":"photography","podcasts":"podcast","poetry":"poetry","politics":"politics","privacy":"privacy","product-management":"product-management","productivity":"productivity","programming":"programming","psychedelics":"psychedelics","psychology":"psychology","race":"race","relationships":"relationships","religion":"religion","remote-work":"remote-work","san-francisco":"san-francisco","science":"science","self":"self","self-driving-cars":"self-driving-cars","sexuality":"sexuality","social-media":"social-media","society":"society","software-engineering":"software-engineering","space":"space","spirituality":"spirituality","sports":"sports","startups":"startup","style":"style","technology":"technology","transportation":"transportation","travel":"travel","true-crime":"true-crime","tv":"tv","ux":"ux","venture-capital":"venture-capital","visual-design":"visual-design","work":"work","world":"world","writing":"writing"},"defaultImages":{"avatar":{"imageId":"1*dmbNkD5D-u45r44go_cf0g.png","height":150,"width":150},"orgLogo":{"imageId":"7*V1_7XP4snlmqrc_0Njontw.png","height":110,"width":500},"postLogo":{"imageId":"bd978bb536350a710e8efb012513429cabdc4c28700604261aeda246d0f980b7","height":810,"width":1440},"postPreviewImage":{"imageId":"1*hn4v1tCaJy7cWMyb0bpNpQ.png","height":386,"width":579}},"collectionStructuredData":{"8d6b8a439e32":{"name":"Elemental","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fcdn-images-1.medium.com\u002Fmax\u002F980\u002F1*9ygdqoKprhwuTVKUM0DLPA@2x.png","width":980,"height":159}}},"3f6ecf56618":{"name":"Forge","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fcdn-images-1.medium.com\u002Fmax\u002F596\u002F1*uULpIlImcO5TDuBZ6lm7Lg@2x.png","width":596,"height":183}}},"ae2a65f35510":{"name":"GEN","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fmiro.medium.com\u002Fmax\u002F264\u002F1*RdVZMdvfV3YiZTw6mX7yWA.png","width":264,"height":140}}},"88d9857e584e":{"name":"LEVEL","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fmiro.medium.com\u002Fmax\u002F540\u002F1*JqYMhNX6KNNb2UlqGqO2WQ.png","width":540,"height":108}}},"7b6769f2748b":{"name":"Marker","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fcdn-images-1.medium.com\u002Fmax\u002F383\u002F1*haCUs0wF6TgOOvfoY-jEoQ@2x.png","width":383,"height":92}}},"444d13b52878":{"name":"OneZero","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fmiro.medium.com\u002Fmax\u002F540\u002F1*cw32fIqCbRWzwJaoQw6BUg.png","width":540,"height":123}}},"8ccfed20cbb2":{"name":"Zora","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fmiro.medium.com\u002Fmax\u002F540\u002F1*tZUQqRcCCZDXjjiZ4bDvgQ.png","width":540,"height":106}}}},"embeddedPostIds":{"coronavirus":"cd3010f9d81f"},"sharedCdcMessaging":{"COVID_APPLICABLE_TAG_SLUGS":[],"COVID_APPLICABLE_TOPIC_NAMES":[],"COVID_APPLICABLE_TOPIC_NAMES_FOR_TOPIC_PAGE":[],"COVID_MESSAGES":{"tierA":{"text":"For more information on the novel coronavirus and Covid-19, visit cdc.gov.","markups":[{"start":66,"end":73,"href":"https:\u002F\u002Fwww.cdc.gov\u002Fcoronavirus\u002F2019-nCoV"}]},"tierB":{"text":"Anyone can publish on Medium per our Policies, but we don’t fact-check every story. For more info about the coronavirus, see cdc.gov.","markups":[{"start":37,"end":45,"href":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Fcategories\u002F201931128-Policies-Safety"},{"start":125,"end":132,"href":"https:\u002F\u002Fwww.cdc.gov\u002Fcoronavirus\u002F2019-nCoV"}]},"paywall":{"text":"This article has been made free for everyone, thanks to Medium Members. For more information on the novel coronavirus and Covid-19, visit cdc.gov.","markups":[{"start":56,"end":70,"href":"https:\u002F\u002Fmedium.com\u002Fmembership"},{"start":138,"end":145,"href":"https:\u002F\u002Fwww.cdc.gov\u002Fcoronavirus\u002F2019-nCoV"}]},"unbound":{"text":"This article is free for everyone, thanks to Medium Members. For more information on the novel coronavirus and Covid-19, visit cdc.gov.","markups":[{"start":45,"end":59,"href":"https:\u002F\u002Fmedium.com\u002Fmembership"},{"start":127,"end":134,"href":"https:\u002F\u002Fwww.cdc.gov\u002Fcoronavirus\u002F2019-nCoV"}]}},"COVID_BANNER_POST_ID_OVERRIDE_WHITELIST":["3b31a67bff4a"]},"sharedVoteMessaging":{"TAGS":["politics","election-2020","government","us-politics","election","2020-presidential-race","trump","donald-trump","democrats","republicans","congress","republican-party","democratic-party","biden","joe-biden","maga"],"TOPICS":["politics","election"],"MESSAGE":{"text":"Find out more about the U.S. election results here.","markups":[{"start":46,"end":50,"href":"https:\u002F\u002Fcookpolitical.com\u002F2020-national-popular-vote-tracker"}]},"EXCLUDE_POSTS":["397ef29e3ca5"]},"embedPostRules":[],"recircOptions":{"v1":{"limit":3},"v2":{"limit":8}},"braintreeClientKey":"production_zjkj96jm_m56f8fqpf7ngnrd4","braintree":{"enabled":true,"merchantId":"m56f8fqpf7ngnrd4","merchantAccountId":{"usd":"AMediumCorporation_instant","eur":"amediumcorporation_EUR","cad":"amediumcorporation_CAD"},"publicKey":"ds2nn34bg2z7j5gd","braintreeEnvironment":"production","dashboardUrl":"https:\u002F\u002Fwww.braintreegateway.com\u002Fmerchants","gracePeriodDurationInDays":14,"mediumMembershipPlanId":{"monthly":"ce105f8c57a3","monthlyV2":"e8a5e126-792b-4ee6-8fba-d574c1b02fc5","monthlyWithTrial":"d5ee3dbe3db8","monthlyPremium":"fa741a9b47a2","yearly":"a40ad4a43185","yearlyV2":"3815d7d6-b8ca-4224-9b8c-182f9047866e","yearlyStaff":"d74fb811198a","yearlyWithTrial":"b3bc7350e5c7","yearlyPremium":"e21bd2c12166","monthlyOneYearFree":"e6c0637a-2bad-4171-ab4f-3c268633d83c","monthly25PercentOffFirstYear":"235ecc62-0cdb-49ae-9378-726cd21c504b","monthly20PercentOffFirstYear":"ba518864-9c13-4a99-91ca-411bf0cac756","monthly15PercentOffFirstYear":"594c029b-9f89-43d5-88f8-8173af4e070e","monthly10PercentOffFirstYear":"c6c7bc9a-40f2-4b51-8126-e28511d5bdb0","monthlyForStudents":"629ebe51-da7d-41fd-8293-34cd2f2030a8","yearlyOneYearFree":"78ba7be9-0d9f-4ece-aa3e-b54b826f2bf1","yearly25PercentOffFirstYear":"2dbb010d-bb8f-4eeb-ad5c-a08509f42d34","yearly20PercentOffFirstYear":"47565488-435b-47f8-bf93-40d5fbe0ebc8","yearly15PercentOffFirstYear":"8259809b-0881-47d9-acf7-6c001c7f720f","yearly10PercentOffFirstYear":"9dd694fb-96e1-472c-8d9e-3c868d5c1506","yearlyForStudents":"e29345ef-ab1c-4234-95c5-70e50fe6bc23","monthlyCad":"p52orjkaceei","yearlyCad":"h4q9g2up9ktt"},"braintreeDiscountId":{"oneMonthFree":"MONTHS_FREE_01","threeMonthsFree":"MONTHS_FREE_03","sixMonthsFree":"MONTHS_FREE_06","fiftyPercentOffOneYear":"FIFTY_PERCENT_OFF_ONE_YEAR"},"3DSecureVersion":"2","defaultCurrency":"usd","providerPlanIdCurrency":{"4ycw":"usd","rz3b":"usd","3kqm":"usd","jzw6":"usd","c2q2":"usd","nnsw":"usd","q8qw":"usd","d9y6":"usd","fx7w":"cad","nwf2":"cad"}},"paypalClientId":"AXj1G4fotC2GE8KzWX9mSxCH1wmPE3nJglf4Z2ig_amnhvlMVX87otaq58niAg9iuLktVNF_1WCMnN7v","paypal":{"host":"https:\u002F\u002Fapi.paypal.com:443","clientMode":"production","serverMode":"live","webhookId":"4G466076A0294510S","monthlyPlan":{"planId":"P-9WR0658853113943TMU5FDQA","name":"Medium Membership (Monthly) with setup fee","description":"Unlimited access to the best and brightest stories on Medium. Membership billed monthly."},"yearlyPlan":{"planId":"P-7N8963881P8875835MU5JOPQ","name":"Medium Membership (Annual) with setup fee","description":"Unlimited access to the best and brightest stories on Medium. Membership billed annually."},"oneYearGift":{"name":"Medium Membership (1 Year, Digital Gift Code)","description":"Unlimited access to the best and brightest stories on Medium. Gift codes can be redeemed at medium.com\u002Fredeem.","price":"50.00","currency":"USD","sku":"membership-gift-1-yr"},"oldMonthlyPlan":{"planId":"P-96U02458LM656772MJZUVH2Y","name":"Medium Membership (Monthly)","description":"Unlimited access to the best and brightest stories on Medium. Membership billed monthly."},"oldYearlyPlan":{"planId":"P-59P80963JF186412JJZU3SMI","name":"Medium Membership (Annual)","description":"Unlimited access to the best and brightest stories on Medium. Membership billed annually."},"monthlyPlanWithTrial":{"planId":"P-66C21969LR178604GJPVKUKY","name":"Medium Membership (Monthly) with setup fee","description":"Unlimited access to the best and brightest stories on Medium. Membership billed monthly."},"yearlyPlanWithTrial":{"planId":"P-6XW32684EX226940VKCT2MFA","name":"Medium Membership (Annual) with setup fee","description":"Unlimited access to the best and brightest stories on Medium. Membership billed annually."},"oldMonthlyPlanNoSetupFee":{"planId":"P-4N046520HR188054PCJC7LJI","name":"Medium Membership (Monthly)","description":"Unlimited access to the best and brightest stories on Medium. Membership billed monthly."},"oldYearlyPlanNoSetupFee":{"planId":"P-7A4913502Y5181304CJEJMXQ","name":"Medium Membership (Annual)","description":"Unlimited access to the best and brightest stories on Medium. Membership billed annually."},"sdkUrl":"https:\u002F\u002Fwww.paypal.com\u002Fsdk\u002Fjs"},"stripePublishableKey":"pk_live_7FReX44VnNIInZwrIIx6ghjl","log":{"json":true,"level":"info"},"imageUploadMaxSizeMb":25,"staffPicks":{"title":"Staff Picks","catalogId":"c7bc6e1ee00f"}},"session":{"xsrf":""}}</script><script>window.__APOLLO_STATE__ = {"ROOT_QUERY":{"__typename":"Query","viewer":null,"postResult({\"id\":\"5c2301120952\"})":{"__ref":"Post:5c2301120952"},"collectionByDomainOrSlug({\"domainOrSlug\":\"medium.com\"})":null},"LinkedAccounts:553500af8d18":{"__typename":"LinkedAccounts","mastodon":null,"id":"553500af8d18"},"UserViewerEdge:userId:553500af8d18-viewerId:lo_f71e99b530fb":{"__typename":"UserViewerEdge","id":"userId:553500af8d18-viewerId:lo_f71e99b530fb","isFollowing":false,"isUser":false,"isMuting":false},"User:553500af8d18":{"__typename":"User","id":"553500af8d18","linkedAccounts":{"__ref":"LinkedAccounts:553500af8d18"},"isSuspended":false,"imageId":"0*UxPdIIrJTIaAso0N","mediumMemberAt":0,"verifications":{"__typename":"VerifiedInfo","isBookAuthor":false},"name":"Samarthbnsl","socialStats":{"__typename":"SocialStats","followerCount":1,"followingCount":1,"collectionFollowingCount":0},"username":"samarthbnsl","customDomainState":null,"hasSubdomain":false,"bio":"","isPartnerProgramEnrolled":false,"viewerEdge":{"__ref":"UserViewerEdge:userId:553500af8d18-viewerId:lo_f71e99b530fb"},"viewerIsUser":false,"newsletterV3":null,"postSubscribeMembershipUpsellShownAt":0,"membership":null,"allowNotes":true,"twitterScreenName":""},"Paragraph:81c645a573e0_0":{"__typename":"Paragraph","id":"81c645a573e0_0","name":"797f","type":"H3","href":null,"layout":null,"metadata":null,"text":"The easiest way to understand and use Coroutines in Kotlin","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:1*JzBLUyeJjZwTxaFLbACO9A.png":{"__typename":"ImageMetadata","id":"1*JzBLUyeJjZwTxaFLbACO9A.png","originalHeight":195,"originalWidth":570,"focusPercentX":null,"focusPercentY":null,"alt":null},"Paragraph:81c645a573e0_1":{"__typename":"Paragraph","id":"81c645a573e0_1","name":"69fa","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:1*JzBLUyeJjZwTxaFLbACO9A.png"},"text":"Get started with Kotlin multi-threading concepts","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:81c645a573e0_2":{"__typename":"Paragraph","id":"81c645a573e0_2","name":"d829","type":"P","href":null,"layout":null,"metadata":null,"text":"As soon as you start building your Android app, you might need to store some data or values that persist locally over time. Jetpack Compose offers two solutions for this: Room database and DataStore.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":124,"end":139,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":171,"end":184,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":189,"end":199,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":171,"end":184,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":189,"end":199,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:81c645a573e0_3":{"__typename":"Paragraph","id":"81c645a573e0_3","name":"1fce","type":"P","href":null,"layout":null,"metadata":null,"text":"Room Database: As the name suggests, this is a SQLite instance of a database stored on your computer that you can use to store and query structured data from your app using coroutines. More on this later in the article.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":13,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":173,"end":185,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:81c645a573e0_4":{"__typename":"Paragraph","id":"81c645a573e0_4","name":"28ab","type":"P","href":null,"layout":null,"metadata":null,"text":"Datastore: This allows you to store key-value pairs, a newer version of SharedPreferences to store data, consider migrating to DataStore instead.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":72,"end":89,"href":"https:\u002F\u002Fdeveloper.android.com\u002Freference\u002Fkotlin\u002Fandroid\u002Fcontent\u002FSharedPreferences","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":0,"end":11,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":72,"end":89,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:81c645a573e0_5":{"__typename":"Paragraph","id":"81c645a573e0_5","name":"22f5","type":"H3","href":null,"layout":null,"metadata":null,"text":"What is coroutine then?","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":23,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:81c645a573e0_6":{"__typename":"Paragraph","id":"81c645a573e0_6","name":"8256","type":"P","href":null,"layout":null,"metadata":null,"text":"You must have understood why you need persistent storage solutions for your app, then what is coroutine, and why you need that.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":94,"end":103,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":94,"end":103,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:81c645a573e0_7":{"__typename":"Paragraph","id":"81c645a573e0_7","name":"1647","type":"ULI","href":null,"layout":null,"metadata":null,"text":"The answer to that is, if you have worked with APIs or Databases, we know that every query or request that is executed, takes a significant amount of time, and we can not let our main thread wait for the results.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:81c645a573e0_8":{"__typename":"Paragraph","id":"81c645a573e0_8","name":"d152","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Especially in our case, where we have an app, that has UI and a user continues to interact with the app, then it is recommended that the UI should get updated and the phone should continue to respond to the user`s touch irrespective of what is going on in the background.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:81c645a573e0_9":{"__typename":"Paragraph","id":"81c645a573e0_9","name":"06ff","type":"P","href":null,"layout":null,"metadata":null,"text":"So the purpose of the coroutine is to perform multi-threading in Kotlin, more like handling asynchronous and returns the result when it is completed just like how we have promises, async and await in React.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":22,"end":31,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":65,"end":71,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":200,"end":205,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":22,"end":31,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":65,"end":72,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":171,"end":179,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":181,"end":186,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":191,"end":196,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:81c645a573e0_10":{"__typename":"Paragraph","id":"81c645a573e0_10","name":"dde7","type":"H3","href":null,"layout":null,"metadata":null,"text":"Basic Coroutine concepts and code snippets","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:81c645a573e0_11":{"__typename":"Paragraph","id":"81c645a573e0_11","name":"c7cd","type":"P","href":null,"layout":null,"metadata":null,"text":"Common terms and keywords to get familiar with:","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":47,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":0,"end":47,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:81c645a573e0_12":{"__typename":"Paragraph","id":"81c645a573e0_12","name":"a8b6","type":"ULI","href":null,"layout":null,"metadata":null,"text":"suspend: this is used to mark a function in kotlin as asynchronous, which means we can start the execution of code block in this function and can continue to other tasks and don’t have to wait for the previous async function to finish execution.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":7,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:81c645a573e0_13":{"__typename":"Paragraph","id":"81c645a573e0_13","name":"6d4a","type":"ULI","href":null,"layout":null,"metadata":null,"text":"runBlocking { }: this is an async function that can have a call for other suspend functions, and we can directly use it in our code, this is a self-sufficient function to handle all the requirements to execute async functions.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":15,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:81c645a573e0_14":{"__typename":"Paragraph","id":"81c645a573e0_14","name":"89e0","type":"ULI","href":null,"layout":null,"metadata":null,"text":"launch{}: this is used to launch the async code block inside it, and return so that we can continue the execution of code outside it while code inside it continues to run.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":8,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:81c645a573e0_15":{"__typename":"Paragraph","id":"81c645a573e0_15","name":"1cee","type":"ULI","href":null,"layout":null,"metadata":null,"text":"async{}: why do we need this if we already have the suspend keyword, async helps us identify the function as async that returns some result, whereas suspend is used to mark the function as suspended","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":9,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":52,"end":59,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":69,"end":74,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":149,"end":156,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:81c645a573e0_16":{"__typename":"Paragraph","id":"81c645a573e0_16","name":"baee","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Deferred\u003CT\u003E: this keyword is optional to use but helps us to identify the variable returned from an async function","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":11,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":100,"end":105,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:81c645a573e0_17":{"__typename":"Paragraph","id":"81c645a573e0_17","name":"8587","type":"ULI","href":null,"layout":null,"metadata":null,"text":"await(): this waits for the value of the deferred type object until the async function is completed and returns the result","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":9,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":41,"end":49,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":72,"end":77,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:81c645a573e0_18":{"__typename":"Paragraph","id":"81c645a573e0_18","name":"eb15","type":"ULI","href":null,"layout":null,"metadata":null,"text":"coroutineScope(): this is used to contain code blocks that can have multiple coroutine executions running in parallel, but how it is different from coroutine or launch is because, coroutineScope can be canceled or stopped(due to exceptions), and return only after all the coroutine inside it has finished","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":16,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":77,"end":86,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":148,"end":157,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":160,"end":168,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":180,"end":194,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":272,"end":281,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:81c645a573e0_19":{"__typename":"Paragraph","id":"81c645a573e0_19","name":"bc79","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Job: as you have observed the launch returns after starting the execution, then how we can manage the execution of that code, so this Job helps us to get an instance of the code execution and stop it using job.cancel()","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":3,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":30,"end":36,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":134,"end":138,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":206,"end":218,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:81c645a573e0_20":{"__typename":"Paragraph","id":"81c645a573e0_20","name":"df9c","type":"P","href":null,"layout":null,"metadata":null,"text":"Now we understand all the keywords associated with Coroutine, let's see them used in the actual code picked up from here","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":116,"end":120,"href":"https:\u002F\u002Fdeveloper.android.com\u002Fcodelabs\u002Fbasic-android-kotlin-compose-coroutines-kotlin-playground?continue=https%3A%2F%2Fdeveloper.android.com%2Fcourses%2Fpathways%2Fandroid-basics-compose-unit-5-pathway-1%23codelab-https%3A%2F%2Fdeveloper.android.com%2Fcodelabs%2Fbasic-android-kotlin-compose-coroutines-kotlin-playground#0","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":51,"end":62,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:81c645a573e0_21":{"__typename":"Paragraph","id":"81c645a573e0_21","name":"d108","type":"PRE","href":null,"layout":null,"metadata":null,"text":"import kotlinx.coroutines.*\n\nfun main() {\n runBlocking {\n println(\"Weather forecast\")\n println(getWeatherReport())\n println(\"Have a good day!\")\n }\n}\n\nsuspend fun getWeatherReport() = coroutineScope {\n val forecast = async { getForecast() }\n val temperature = async { getTemperature() }\n \"${forecast.await()} ${temperature.await()}\"\n}\n\nsuspend fun getForecast(): String {\n delay(1000)\n return \"Sunny\"\n}\n\nsuspend fun getTemperature(): String {\n delay(1000)\n return \"30\\u00b0C\"\n}","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":{"__typename":"CodeBlockMetadata","mode":"AUTO","lang":"kotlin"},"iframe":null,"mixtapeMetadata":null},"Paragraph:81c645a573e0_22":{"__typename":"Paragraph","id":"81c645a573e0_22","name":"7348","type":"P","href":null,"layout":null,"metadata":null,"text":"Breaking down the code:","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:81c645a573e0_23":{"__typename":"Paragraph","id":"81c645a573e0_23","name":"c079","type":"ULI","href":null,"layout":null,"metadata":null,"text":"getForecast() and getTemperature(): are created with the suspend keyword to mark it as a time-taking function and run on other thread","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":14,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":18,"end":36,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":0,"end":14,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":18,"end":36,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":57,"end":65,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:81c645a573e0_24":{"__typename":"Paragraph","id":"81c645a573e0_24","name":"7dd4","type":"ULI","href":null,"layout":null,"metadata":null,"text":"getWeatherReport(): a coroutineScope is created that contains 2 async functions, so it will start the execution of the first async function, then move to the second async function to start its execution, and then when it arrives at 3rd line, then it will wait for forecast and temperature to return the value (that also means that async functions have completed), so coroutineScope will be completed and return.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":19,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":62,"end":70,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":367,"end":381,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":0,"end":19,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":22,"end":37,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":64,"end":69,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":125,"end":139,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":165,"end":180,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":367,"end":381,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:81c645a573e0_25":{"__typename":"Paragraph","id":"81c645a573e0_25","name":"b9de","type":"ULI","href":null,"layout":null,"metadata":null,"text":"runBlocking(): this will contain sync as well as suspend functions and start its execution in order.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":13,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":33,"end":37,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":49,"end":66,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:81c645a573e0_26":{"__typename":"Paragraph","id":"81c645a573e0_26","name":"97e8","type":"P","href":null,"layout":null,"metadata":null,"text":"Here is the output of the above function:","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:81c645a573e0_27":{"__typename":"Paragraph","id":"81c645a573e0_27","name":"0d85","type":"PRE","href":null,"layout":null,"metadata":null,"text":"Weather forecast\nSunny 30°C\nHave a good day!","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":{"__typename":"CodeBlockMetadata","mode":"AUTO","lang":"css"},"iframe":null,"mixtapeMetadata":null},"Paragraph:81c645a573e0_28":{"__typename":"Paragraph","id":"81c645a573e0_28","name":"427c","type":"H4","href":null,"layout":null,"metadata":null,"text":"Extra brownie points","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:81c645a573e0_29":{"__typename":"Paragraph","id":"81c645a573e0_29","name":"0f76","type":"ULI","href":null,"layout":null,"metadata":null,"text":"A coroutineScope will be returned if and only if all the coroutine launched inside have been completed or canceled (if some throw an exception or explicitly canceled) like the following example code block","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"EM","start":2,"end":16,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":57,"end":66,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:81c645a573e0_30":{"__typename":"Paragraph","id":"81c645a573e0_30","name":"5896","type":"PRE","href":null,"layout":null,"metadata":null,"text":"...\n\nsuspend fun getWeatherReport() = coroutineScope {\n val forecast = async { getForecast() }\n val temperature = async { getTemperature() }\n \n delay(200)\n temperature.cancel()\n\n \"${forecast.await()}\"\n}\n\n...\n\n\n\u002F\u002FOutput \nWeather forecast\nSunny\nHave a good day!","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":{"__typename":"CodeBlockMetadata","mode":"AUTO","lang":"kotlin"},"iframe":null,"mixtapeMetadata":null},"Paragraph:81c645a573e0_31":{"__typename":"Paragraph","id":"81c645a573e0_31","name":"9f83","type":"ULI","href":null,"layout":null,"metadata":null,"text":"how to handle the execution launched by launch keyword, by using its instance in a variable as Job, this can contain a coroutine that can itself have another coroutine inside it (kind of parent-child relationships), so when we cancel a parent coroutine, it cancels all the child coroutine also","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":95,"end":98,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":40,"end":46,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":95,"end":98,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":119,"end":129,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":158,"end":167,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":236,"end":254,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:81c645a573e0_32":{"__typename":"Paragraph","id":"81c645a573e0_32","name":"ceda","type":"PRE","href":null,"layout":null,"metadata":null,"text":"val job = launch {\n ... \n\n val childJob = launch { ... }\n\n ...\n}\n\n...\n\n\u002F\u002Fcancelled using \n\njob.cancel()","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":{"__typename":"CodeBlockMetadata","mode":"EXPLICIT","lang":"kotlin"},"iframe":null,"mixtapeMetadata":null},"Paragraph:81c645a573e0_33":{"__typename":"Paragraph","id":"81c645a573e0_33","name":"9fe9","type":"ULI","href":null,"layout":null,"metadata":null,"text":"A particular coroutine can be identified using, all its information about the context in which the coroutine is running in is:","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"EM","start":13,"end":22,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":78,"end":85,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":99,"end":108,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:81c645a573e0_34":{"__typename":"Paragraph","id":"81c645a573e0_34","name":"2124","type":"PRE","href":null,"layout":null,"metadata":null,"text":"CouroutineContext = Job() + Dispatchers.Main + exceptionHandler","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":{"__typename":"CodeBlockMetadata","mode":"AUTO","lang":"ini"},"iframe":null,"mixtapeMetadata":null},"Paragraph:81c645a573e0_35":{"__typename":"Paragraph","id":"81c645a573e0_35","name":"a8b9","type":"ULI","href":null,"layout":null,"metadata":null,"text":"We can choose where to execute our blocking code away from the main thread, kotlin provides 3 types of Dispatchers: Dispatchers.Main, Dispatchers.IO, Dispatchers.Default. Dispatchers mean a thread can be started, does some work (executes some code), and then terminates when there’s no more work to be done, example below","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":63,"end":67,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":63,"end":67,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":116,"end":132,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":134,"end":171,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:81c645a573e0_36":{"__typename":"Paragraph","id":"81c645a573e0_36","name":"cf29","type":"PRE","href":null,"layout":null,"metadata":null,"text":"import kotlinx.coroutines.*\n\nfun main() {\n runBlocking {\n println(\"${Thread.currentThread().name} - runBlocking function\")\n launch {\n println(\"${Thread.currentThread().name} - launch function\")\n withContext(Dispatchers.Default) {\n println(\"${Thread.currentThread().name} - withContext function\")\n delay(1000)\n println(\"10 results found.\")\n }\n println(\"${Thread.currentThread().name} - end of launch function\")\n }\n println(\"Loading...\")\n }\n}\n\n\n\u002F\u002FOutput\n\nmain @coroutine#1 - runBlocking function\nLoading...\nmain @coroutine#2 - launch function\nDefaultDispatcher-worker-1 @coroutine#2 - withContext function\n10 results found.\nmain @coroutine#2 - end of launch function","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":{"__typename":"CodeBlockMetadata","mode":"AUTO","lang":"kotlin"},"iframe":null,"mixtapeMetadata":null},"Paragraph:81c645a573e0_37":{"__typename":"Paragraph","id":"81c645a573e0_37","name":"34b5","type":"H4","href":null,"layout":null,"metadata":null,"text":"Summary","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:81c645a573e0_38":{"__typename":"Paragraph","id":"81c645a573e0_38","name":"836b","type":"P","href":null,"layout":null,"metadata":null,"text":"In conclusion, the coroutine is a powerful tool for writing async code that is a necessity when we write Networking code or Database queries. Hope you have an understanding of the coroutine, follow this article on how to create a Room database and write operations using the coroutine.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":230,"end":243,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":180,"end":189,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":275,"end":284,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:81c645a573e0_39":{"__typename":"Paragraph","id":"81c645a573e0_39","name":"2ab5","type":"P","href":null,"layout":null,"metadata":null,"text":"Happy Coding!!!","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:81c645a573e0_40":{"__typename":"Paragraph","id":"81c645a573e0_40","name":"ff8e","type":"P","href":null,"layout":null,"metadata":null,"text":"Please don’t forget to give claps 👏 and share this with your fellow coder friends.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:81c645a573e0_41":{"__typename":"Paragraph","id":"81c645a573e0_41","name":"c924","type":"BQ","href":null,"layout":null,"metadata":null,"text":"Follow me to look into other repos covering new concepts in all the programming language","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":0,"end":9,"href":"https:\u002F\u002Fgithub.com\u002Fimsamrth","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":0,"end":88,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:":{"__typename":"ImageMetadata","id":"","alt":null,"focusPercentX":null,"focusPercentY":null,"originalHeight":null,"originalWidth":null},"PostViewerEdge:postId:5c2301120952-viewerId:lo_f71e99b530fb":{"__typename":"PostViewerEdge","shouldIndexPostForExternalSearch":true,"id":"postId:5c2301120952-viewerId:lo_f71e99b530fb"},"Tag:kotlin-beginners":{"__typename":"Tag","id":"kotlin-beginners","displayTitle":"Kotlin Beginners","normalizedTagSlug":"kotlin-beginners"},"Tag:kotlin-coroutines":{"__typename":"Tag","id":"kotlin-coroutines","displayTitle":"Kotlin Coroutines","normalizedTagSlug":"kotlin-coroutines"},"Tag:android":{"__typename":"Tag","id":"android","displayTitle":"Android","normalizedTagSlug":"android"},"Tag:room-database":{"__typename":"Tag","id":"room-database","displayTitle":"Room Database","normalizedTagSlug":"room-database"},"Tag:2025":{"__typename":"Tag","id":"2025","displayTitle":"2025","normalizedTagSlug":"2025"},"Post:5c2301120952":{"__typename":"Post","id":"5c2301120952","collection":null,"content({\"postMeteringOptions\":{}})":{"__typename":"PostContent","isLockedPreviewOnly":false,"bodyModel":{"__typename":"RichText","sections":[{"__typename":"Section","name":"bfa0","startIndex":0,"textLayout":null,"imageLayout":null,"backgroundImage":null,"videoLayout":null,"backgroundVideo":null}],"paragraphs":[{"__ref":"Paragraph:81c645a573e0_0"},{"__ref":"Paragraph:81c645a573e0_1"},{"__ref":"Paragraph:81c645a573e0_2"},{"__ref":"Paragraph:81c645a573e0_3"},{"__ref":"Paragraph:81c645a573e0_4"},{"__ref":"Paragraph:81c645a573e0_5"},{"__ref":"Paragraph:81c645a573e0_6"},{"__ref":"Paragraph:81c645a573e0_7"},{"__ref":"Paragraph:81c645a573e0_8"},{"__ref":"Paragraph:81c645a573e0_9"},{"__ref":"Paragraph:81c645a573e0_10"},{"__ref":"Paragraph:81c645a573e0_11"},{"__ref":"Paragraph:81c645a573e0_12"},{"__ref":"Paragraph:81c645a573e0_13"},{"__ref":"Paragraph:81c645a573e0_14"},{"__ref":"Paragraph:81c645a573e0_15"},{"__ref":"Paragraph:81c645a573e0_16"},{"__ref":"Paragraph:81c645a573e0_17"},{"__ref":"Paragraph:81c645a573e0_18"},{"__ref":"Paragraph:81c645a573e0_19"},{"__ref":"Paragraph:81c645a573e0_20"},{"__ref":"Paragraph:81c645a573e0_21"},{"__ref":"Paragraph:81c645a573e0_22"},{"__ref":"Paragraph:81c645a573e0_23"},{"__ref":"Paragraph:81c645a573e0_24"},{"__ref":"Paragraph:81c645a573e0_25"},{"__ref":"Paragraph:81c645a573e0_26"},{"__ref":"Paragraph:81c645a573e0_27"},{"__ref":"Paragraph:81c645a573e0_28"},{"__ref":"Paragraph:81c645a573e0_29"},{"__ref":"Paragraph:81c645a573e0_30"},{"__ref":"Paragraph:81c645a573e0_31"},{"__ref":"Paragraph:81c645a573e0_32"},{"__ref":"Paragraph:81c645a573e0_33"},{"__ref":"Paragraph:81c645a573e0_34"},{"__ref":"Paragraph:81c645a573e0_35"},{"__ref":"Paragraph:81c645a573e0_36"},{"__ref":"Paragraph:81c645a573e0_37"},{"__ref":"Paragraph:81c645a573e0_38"},{"__ref":"Paragraph:81c645a573e0_39"},{"__ref":"Paragraph:81c645a573e0_40"},{"__ref":"Paragraph:81c645a573e0_41"}]},"validatedShareKey":"","shareKeyCreator":null},"creator":{"__ref":"User:553500af8d18"},"inResponseToEntityType":null,"isLocked":false,"isMarkedPaywallOnly":false,"lockedSource":"LOCKED_POST_SOURCE_NONE","mediumUrl":"https:\u002F\u002Fmedium.com\u002F@samarthbnsl\u002Fthe-easiest-way-to-understand-and-use-coroutines-in-kotlin-5c2301120952","primaryTopic":null,"topics":[{"__typename":"Topic","slug":"android-development"},{"__typename":"Topic","slug":"programming"}],"isPublished":true,"latestPublishedVersion":"81c645a573e0","visibility":"PUBLIC","postResponses":{"__typename":"PostResponses","count":0},"clapCount":0,"allowResponses":true,"isLimitedState":false,"title":"The easiest way to understand and use Coroutines in Kotlin","isSeries":false,"sequence":null,"uniqueSlug":"the-easiest-way-to-understand-and-use-coroutines-in-kotlin-5c2301120952","socialTitle":"","socialDek":"","canonicalUrl":"","metaDescription":"","latestPublishedAt":1732311565757,"readingTime":4.39622641509434,"previewContent":{"__typename":"PreviewContent","subtitle":"As soon as you start building your Android app, you might need to store some data or values that persist locally over time. Jetpack Compose…"},"previewImage":{"__ref":"ImageMetadata:"},"isShortform":false,"seoTitle":"","firstPublishedAt":1732311565757,"updatedAt":1732330392461,"shortformType":"SHORTFORM_TYPE_LINK","seoDescription":"","viewerEdge":{"__ref":"PostViewerEdge:postId:5c2301120952-viewerId:lo_f71e99b530fb"},"isSuspended":false,"license":"ALL_RIGHTS_RESERVED","tags":[{"__ref":"Tag:kotlin-beginners"},{"__ref":"Tag:kotlin-coroutines"},{"__ref":"Tag:android"},{"__ref":"Tag:room-database"},{"__ref":"Tag:2025"}],"isNewsletter":false,"statusForCollection":null,"pendingCollection":null,"detectedLanguage":"en","wordCount":1112,"layerCake":0,"responsesLocked":false}}</script><script>window.__MIDDLEWARE_STATE__={"session":{"xsrf":""},"cache":{"cacheStatus":"HIT"}}</script><script src="https://cdn-client.medium.com/lite/static/js/manifest.b2314f6d.js"></script><script src="https://cdn-client.medium.com/lite/static/js/9865.1496d74a.js"></script><script src="https://cdn-client.medium.com/lite/static/js/main.24534aeb.js"></script><script src="https://cdn-client.medium.com/lite/static/js/instrumentation.d9108df7.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/reporting.ff22a7a5.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/5049.d1ead72d.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/4810.6318add7.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/6618.db187378.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/2707.b0942613.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/9977.5b3eb23a.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/8599.1ab63137.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/5250.9f9e01d2.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/6349.b071a958.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/2648.26563adf.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/8393.826a25fb.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/7079.67349d50.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/3735.afb7e926.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/5642.a2d9f6a1.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/6546.cd03f950.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/6834.08de95de.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/7346.72622eb9.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/2420.2a5e2d95.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/839.ca7937c2.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/7975.d195c6f1.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/2106.21ff89d3.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/7394.3d049572.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/2961.00a48598.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/8204.c4082863.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/4391.59acaed3.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/PostPage.MainContent.c8a11795.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/8414.6565ad5f.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/3974.8d3e0217.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/2527.a0afad8a.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/PostResponsesContent.36c2ecf4.chunk.js"></script><script>window.main();</script><script>(function(){function c(){var b=a.contentDocument||a.contentWindow.document;if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'8e74c30c082c5fdf',t:'MTczMjQwMjY4NS4wMDAwMDA='};var a=document.createElement('script');a.nonce='';a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script></body></html>

Pages: 1 2 3 4 5 6 7 8 9 10