CINXE.COM

ProAndroidDev

<!DOCTYPE html><html xmlns:cc="http://creativecommons.org/ns#"><head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# medium-com: http://ogp.me/ns/fb/medium-com#"><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=contain"><title>ProAndroidDev</title><link rel="canonical" href="https://proandroiddev.com"><link id="feedLink" rel="alternate" type="application/rss+xml" title="RSS" href="https://proandroiddev.com/feed"><meta name="robots" content="index,follow"><meta name="title" content="ProAndroidDev"><meta name="referrer" content="unsafe-url"><meta name="description" content="The latest posts from Android Professionals and Google Developer Experts."><meta name="theme-color" content="#000000"><meta property="og:title" content="ProAndroidDev"><meta property="twitter:title" content="ProAndroidDev"><meta property="og:url" content="https://proandroiddev.com/"><meta property="og:image" content="https://cdn-images-1.medium.com/max/1200/1*XVtdl45m8YaYrPI4buJ5yQ.png"><meta property="fb:app_id" content="542599432471018"><meta property="og:description" content="The latest posts from Android Professionals and Google Developer Experts."><meta name="twitter:description" content="The latest posts from Android Professionals and Google Developer Experts."><meta name="twitter:image:src" content="https://cdn-images-1.medium.com/max/1200/1*XVtdl45m8YaYrPI4buJ5yQ.png"><meta property="og:type" content="medium-com:collection"><meta name="twitter:card" content="summary_large_image"><meta property="medium-com:creator" content="https://proandroiddev.com/@g-fawson"><meta name="twitter:site" content="@proandroiddev"><meta property="og:site_name" content="ProAndroidDev"><meta name="twitter:app:name:iphone" content="Medium"><meta name="twitter:app:id:iphone" content="828256236"><meta name="twitter:app:url:iphone" content="medium://proandroiddev"><meta property="al:ios:app_name" content="Medium"><meta property="al:ios:app_store_id" content="828256236"><meta property="al:android:package" content="com.medium.reader"><meta property="al:android:app_name" content="Medium"><meta property="al:ios:url" content="medium://proandroiddev"><meta property="al:android:url" content="medium://proandroiddev"><meta property="al:web:url" content="https://proandroiddev.com/"><link rel="search" type="application/opensearchdescription+xml" title="Medium" href="/osd.xml" /><link rel="alternate" href="android-app://com.medium.reader/https/medium.com/proandroiddev" /><script type="application/ld+json">{"@context": "http://schema.org", "@graph": [{"@type": "WebSite", "url": "https:\/\/proandroiddev.com", "name": "ProAndroidDev", "alternateName": "The latest posts from Android Professionals and Google Developer Experts."},{"@type": "Organization", "url": "https:\/\/proandroiddev.com", "name": "ProAndroidDev"}]}</script><link rel="stylesheet" href="https://cdn-static-1.medium.com/_/fp/css/main-branding-base.ouwh4uMviI3QQWIjxRhkHA.12.css"><script>!function(n,e){var t,o,i,c=[],f={passive:!0,capture:!0},r=new Date,a="pointerup",u="pointercancel";function p(n,c){t||(t=c,o=n,i=new Date,w(e),s())}function s(){o>=0&&o<i-r&&(c.forEach(function(n){n(o,t)}),c=[])}function l(t){if(t.cancelable){var o=(t.timeStamp>1e12?new Date:performance.now())-t.timeStamp;"pointerdown"==t.type?function(t,o){function i(){p(t,o),r()}function c(){r()}function r(){e(a,i,f),e(u,c,f)}n(a,i,f),n(u,c,f)}(o,t):p(o,t)}}function w(n){["click","mousedown","keydown","touchstart","pointerdown"].forEach(function(e){n(e,l,f)})}w(n),self.perfMetrics=self.perfMetrics||{},self.perfMetrics.onFirstInputDelay=function(n){c.push(n),s()}}(addEventListener,removeEventListener);</script><script>document.domain = document.domain;</script><script>if (window.top !== window.self) window.location = 'about:blank';var OB_startTime = new Date().getTime(); var OB_loadErrors = []; function _onerror(e) { OB_loadErrors.push(e) }; if (document.addEventListener) document.addEventListener("error", _onerror, true); else if (document.attachEvent) document.attachEvent("onerror", _onerror); function _asyncScript(u) {var d = document, f = d.getElementsByTagName("script")[0], s = d.createElement("script"); s.type = "text/javascript"; s.async = true; s.src = u; f.parentNode.insertBefore(s, f);}function _asyncStyles(u) {var d = document, f = d.getElementsByTagName("script")[0], s = d.createElement("link"); s.rel = "stylesheet"; s.href = u; f.parentNode.insertBefore(s, f); return s}(new Image()).src = "/_/stat?event=pixel.load&origin=" + encodeURIComponent(location.origin);</script><script>window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date; ga("create", "G-7JY7T788PK", "auto", {"allowLinker": true, "legacyCookieDomain": window.location.hostname});ga("send", "pageview");</script><script async src="https://www.google-analytics.com/analytics.js"></script><script>(function () {var height = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight; var width = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth; document.write("<style>section.section-image--fullBleed.is-backgrounded {padding-top: " + Math.round(1.1 * height) + "px;}section.section-image--fullScreen.is-backgrounded, section.section-image--coverFade.is-backgrounded {min-height: " + height + "px; padding-top: " + Math.round(0.5 * height) + "px;}.u-height100vh {height: " + height + "px !important;}.u-height110vh {height: " + Math.round(1.1 * height) + "px !important;}.u-minHeight100vh {min-height: " + height + "px !important;}.u-maxHeight100vh {max-height: " + height + "px !important;}section.section-image--coverFade {height: " + height + "px;}.section-aspectRatioViewportPlaceholder, .section-aspectRatioViewportCropPlaceholder {max-height: " + height + "px;}.section-aspectRatioViewportBottomSpacer, .section-aspectRatioViewportBottomPlaceholder {max-height: " + Math.round(0.5 * height) + "px;}.zoomable:before {top: " + (-1 * height) + "px; left: " + (-1 * width) + "px; padding: " + height + "px " + width + "px;}</style>");})()</script><!--[if lt IE 9]><script charset="UTF-8" src="https://cdn-static-1.medium.com/_/fp/js/shiv.RI2ePTZ5gFmMgLzG5bEVAA.12.js"></script><![endif]--><link rel="icon" href="https://cdn-images-1.medium.com/fit/c/256/256/1*A8VytPZQhvUf_MG6hm_Dlw.png" class="js-favicon"><link rel="apple-touch-icon" sizes="152x152" href="https://cdn-images-1.medium.com/fit/c/304/304/1*XVtdl45m8YaYrPI4buJ5yQ.png"><link rel="apple-touch-icon" sizes="120x120" href="https://cdn-images-1.medium.com/fit/c/240/240/1*XVtdl45m8YaYrPI4buJ5yQ.png"><link rel="apple-touch-icon" sizes="76x76" href="https://cdn-images-1.medium.com/fit/c/152/152/1*XVtdl45m8YaYrPI4buJ5yQ.png"><link rel="apple-touch-icon" sizes="60x60" href="https://cdn-images-1.medium.com/fit/c/120/120/1*XVtdl45m8YaYrPI4buJ5yQ.png"><link rel="mask-icon" href="https://cdn-static-1.medium.com/_/fp/icons/monogram-mask.KPLCSFEZviQN0jQ7veN2RQ.12.svg" color="#171717"></head><body itemscope class=" browser-ie os-windows v-unbound v-glyph v-glyph--m2-unbound-source-serif-pro is-noJs"><script>document.body.className = document.body.className.replace(/(^|\s)is-noJs(\s|$)/, "$1is-js$2")</script><div class="site-main" id="container"><div class="butterBar butterBar--error"></div><div class="surface"><div id="prerendered" class="screenContent"><div class="metabar u-clearfix js-metabar"><div class="branch-journeys-top"></div><div class="js-metabarMiddle metabar-inner u-marginAuto u-maxWidth1032 u-flexCenter u-justifyContentSpaceBetween u-height65 u-xs-height56 u-paddingHorizontal20"><div class="metabar-block u-flex1 u-flexCenter"><div class="js-metabarLogoLeft"><a href="https://medium.com/" data-log-event="home" class="siteNav-logo u-fillBlack u-flex0 u-flexCenter u-paddingTop0"><span class="svgIcon svgIcon--wordmarkMedium svgIcon--120x26px u-flex"><svg class="svgIcon-use" width="120" height="26" ><path d="M29.57 1.404l.036-.008V1.12h-7.27l-6.75 15.979-6.75-15.98H1.003v.278l.035.008c1.327.302 2 .752 2 2.374v18.993c0 1.623-.676 2.073-2.003 2.374L1 25.153v.279h5.315v-.278l-.035-.008c-1.327-.302-2-.751-2-2.374V4.88l8.67 20.552h.492l8.924-21.125V23.24c-.114 1.282-.782 1.677-1.983 1.95l-.036.009v.275h9.259V25.2l-.036-.008c-1.203-.274-1.886-.67-2-1.95l-.006-19.464h.006c0-1.622.674-2.072 2-2.374zm4.23 12.582c.15-3.412 1.367-5.875 3.41-5.918.629.01 1.157.219 1.568.62.872.852 1.282 2.634 1.219 5.298h-6.198zm-.092.962h10.85v-.046c-.03-2.61-.78-4.64-2.228-6.033-1.25-1.204-3.103-1.867-5.048-1.867h-.043c-1.01 0-2.248.246-3.13.693a7.316 7.316 0 00-2.623 2.086c-1.185 1.479-1.903 3.477-2.078 5.724a13.717 13.717 0 00-.04.755c-.004.195-.005.39-.001.587.117 5.087 2.846 9.153 7.692 9.153 4.254 0 6.73-3.132 7.348-7.336l-.312-.11c-1.085 2.259-3.034 3.628-5.252 3.461-3.028-.228-5.347-3.32-5.137-7.066m23.122 6.893c-.356.85-1.099 1.319-2.094 1.319-.995 0-1.905-.689-2.552-1.939-.694-1.342-1.06-3.24-1.06-5.487 0-4.678 1.445-7.704 3.68-7.704.937 0 1.674.468 2.026 1.284v12.527zm7.198 3.335c-1.327-.316-2-.787-2-2.492V0l-8.062 2.392v.293l.05-.004c1.111-.09 1.866.064 2.304.472.343.32.51.809.51 1.498v3.11C56.033 7.25 55.088 7 53.94 7c-2.326 0-4.453.987-5.986 2.779-1.599 1.867-2.444 4.42-2.444 7.38 0 5.287 2.584 8.84 6.43 8.84 2.25 0 4.06-1.242 4.888-3.336v2.811h7.233v-.29l-.035-.008zM70.94 3.085c0-1.65-1.236-2.896-2.875-2.896-1.632 0-2.908 1.272-2.908 2.896 0 1.624 1.278 2.896 2.908 2.896 1.64 0 2.875-1.245 2.875-2.896zm1.903 22.092c-1.327-.316-2-.787-2-2.492h-.006V7.055l-7.234 2.092v.284l.043.004c1.566.14 1.994.683 1.994 2.525v13.515h7.24v-.29l-.037-.008zm18.536 0c-1.327-.316-2-.787-2-2.492V7.055L82.49 9.078v.285l.04.004c1.28.136 1.65.71 1.65 2.56v9.88c-.426.85-1.227 1.356-2.196 1.39-1.573 0-2.439-1.07-2.439-3.012V7.055l-7.234 2.092v.284l.044.004c1.565.14 1.994.683 1.994 2.525v8.362a9.443 9.443 0 00.15 1.741l.13.57C75.243 24.845 76.848 26 79.362 26c2.129 0 3.996-1.328 4.818-3.405v2.885h7.233v-.291l-.034-.012zm28.102.298v-.291l-.035-.009c-1.44-.334-2.001-.964-2.001-2.248V12.295C117.445 8.98 115.597 7 112.5 7c-2.257 0-4.16 1.314-4.893 3.36-.582-2.168-2.257-3.36-4.734-3.36-2.175 0-3.88 1.156-4.612 3.11V7.056l-7.233 2.006v.286l.043.004c1.547.138 1.994.697 1.994 2.492v13.631h6.75v-.29l-.037-.01c-1.148-.271-1.519-.767-1.519-2.04V10.95c.304-.715.917-1.562 2.127-1.562 1.504 0 2.266 1.05 2.266 3.116v12.972h6.751v-.29l-.035-.01c-1.149-.271-1.52-.767-1.52-2.04V12.294a7.107 7.107 0 00-.095-1.21c.322-.777.97-1.696 2.23-1.696 1.524 0 2.265 1.02 2.265 3.116v12.972h7.233z"/></svg></span><span class="u-textScreenReader">Homepage</span></a></div><div class="u-paddingLeft10 u-sm-show r-paddingRight10"><a href="https://rsci.app.link/?%24canonical_url=https%3A%2F%2Fmedium.com/proandroiddev%3F~feature=LoMobileNavBar&~channel=ShowCollectionHome&~stage=m2">Open in app</a></div></div><div class="metabar-block u-flex0 u-flexCenter"><div class="u-flexCenter u-height65 u-xs-height56"><div class="buttonSet buttonSet--wide u-lineHeightInherit"><a class="button button--primary button--chromeless u-accentColor--buttonNormal is-inSiteNavBar u-xs-hide js-signInButton" href="https://medium.com/m/signin?redirect=https%3A%2F%2Fproandroiddev.com%2F%3Fsource%3Dtopic_portal---recommended_stories---android---2-85--------------------6cec5da1_562a_4436_bc49_8ba467f823c3-------&amp;source=--------------------------nav_reg&amp;operation=login" data-action="sign-in-prompt" data-redirect="https://proandroiddev.com/?source=topic_portal---recommended_stories---android---2-85--------------------6cec5da1_562a_4436_bc49_8ba467f823c3-------" data-action-source="--------------------------nav_reg">Sign in</a><a class="button button--primary button--withChrome u-accentColor--buttonNormal is-inSiteNavBar js-signUpButton" href="https://medium.com/m/signin?redirect=https%3A%2F%2Fproandroiddev.com%2F%3Fsource%3Dtopic_portal---recommended_stories---android---2-85--------------------6cec5da1_562a_4436_bc49_8ba467f823c3-------&amp;source=--------------------------nav_reg&amp;operation=register" data-action="sign-up-prompt" data-redirect="https://proandroiddev.com/?source=topic_portal---recommended_stories---android---2-85--------------------6cec5da1_562a_4436_bc49_8ba467f823c3-------" data-action-source="--------------------------nav_reg">Get started</a></div></div></div></div></div><div class="metabar metabar--spacer js-metabarSpacer u-height65 u-xs-height56"></div><div class="collectionHeader js-collectionHeaderContainer u-relative collectionHeader--layoutMedium collectionHeader--alignmentLeft collectionHeader--withLogo collectionHeader--withBackground collectionHeader--colorBehaviorBold collectionHeader--withNavigation collectionHeader--editorLayoutLogo is-modeView is-whiteLabel u-tintBgColor"><div class="collectionHeader-aspectRatioTable"><div class="collectionHeader-aspectRatioContent u-backgroundSizeCover js-collectionHeaderBackground" style="background-image: url(&quot;https://cdn-images-1.medium.com/max/2400/1*i5UmD6poC0MpEw0UlnWhTQ.png&quot;); background-position: 50% 50% !important;"><div class="collectionHeader-overlayBackground u-height100vh"></div><header class="collectionHeader-heroAndInlineNav u-borderBox u-maxWidth1072 u-paddingLeft20 u-paddingRight20 u-marginAuto u-foreground js-collectionHeader"><div class="collectionHeader-hero js-collectionHeaderHero u-clearfix u-imageSpectrum"><div class="collectionHeader-heroInner"><div class="collectionHeader-logo js-collectionHeaderLogo" style="width: 1px; float: left; padding-right: 20px; margin-right: 0;"><a class="link u-baseColor--link" href="https://proandroiddev.com" title="Go to ProAndroidDev" aria-label="Go to ProAndroidDev" data-collection-slug="proandroiddev"><div class="u-relative u-marginAuto"><div style="padding-bottom: 200%"></div><img class="collectionHeader-logoImage js-collectionHeaderLogoImage" src="https://cdn-images-1.medium.com/max/2/1*V45--ieyNysokCIUqFXTKw@2x.png" data-image-id="1*V45--ieyNysokCIUqFXTKw@2x.png" data-width="1" data-height="2" /></div></a></div><div class="collectionHeader-nameAndDescription u-hide"><a class="link u-baseColor--link" href="https://proandroiddev.com" title="Go to ProAndroidDev" aria-label="Go to ProAndroidDev" data-collection-slug="proandroiddev"><h1 class="collectionHeader-name js-collectionName">ProAndroidDev</h1></a><h2 class="collectionHeader-description js-collectionDescription">The latest posts from Android Professionals and Google Developer Experts.</h2></div></div></div></header></div><div class="collectionHeader-aspectRatioCell"><div class="collectionHeader-aspectRatioFullWidth"></div></div></div><div class="collectionHeader-blockNav"><div class="u-borderBox u-maxWidth1072 u-paddingLeft20 u-paddingRight20 u-marginAuto"><nav class="collectionHeader-nav u-clearfix js-collectionHeaderNav u-lineHeight40 u-overflowHiddenY u-tintSpectrum"><div class="buttonSet u-flex1 u-noWrap u-overflowX u-paddingBottom100 u-xs-marginRight15"><li class="collectionHeader-navItem js-collectionNavItem u-inlineBlock u-fontSize13 u-textUppercase u-letterSpacing1px u-textColorNormal u-xs-paddingRight12 u-xs-marginRight0"><a class="link link--darken u-accentColor--textDarken link--noUnderline u-baseColor--link js-navItemLink" href="https://proandroiddev.com/submission-guidelines-b2efa7f46272">Submit</a></li><li class="collectionHeader-navItem js-collectionNavItem u-inlineBlock u-fontSize13 u-textUppercase u-letterSpacing1px u-textColorNormal u-xs-paddingRight12 u-xs-marginRight0"><a class="link link--darken u-accentColor--textDarken link--noUnderline u-baseColor--link js-navItemLink" href="https://proandroiddev.com/archive">Archive</a></li><li class="collectionHeader-navItem js-collectionNavItem u-inlineBlock u-fontSize13 u-textUppercase u-letterSpacing1px u-textColorNormal u-xs-paddingRight12 u-xs-marginRight0"><a class="link link--darken u-accentColor--textDarken link--noUnderline u-baseColor--link js-navItemLink" href="https://proandroiddev.com/about">About</a></li><span class="u-borderLeft1 u-paddingLeft22 u-xs-paddingLeft12 u-baseColor--borderLight"></span><li class="collectionHeader-navItem js-collectionNavItem u-inlineBlock u-fontSize13 u-textUppercase u-letterSpacing1px u-textColorNormal u-xs-paddingRight12 u-xs-marginRight0 is-external"><a class="link link--darkenOnHover u-accentColor--textDarken link--noUnderline u-baseColor--link js-navItemLink" href="https://academy.droidcon.com" rel="nofollow noopener" target="_blank">droidcon Academy</a></li></div><div class="buttonSet u-textAlignRight u-marginLeft18 u-flex0 u-noWrap"><label class="button button--small button--chromeless button--withIcon button--withSvgIcon inputGroup u-sm-hide metabar-predictiveSearch u-baseColor--buttonNormal u-baseColor--placeholderNormal" title="Search"><span class="svgIcon svgIcon--search svgIcon--25px u-baseColor--iconLight"><svg class="svgIcon-use" width="25" height="25" ><path d="M20.067 18.933l-4.157-4.157a6 6 0 10-.884.884l4.157 4.157a.624.624 0 10.884-.884zM6.5 11c0-2.62 2.13-4.75 4.75-4.75S16 8.38 16 11s-2.13 4.75-4.75 4.75S6.5 13.62 6.5 11z"/></svg></span><input class="js-predictiveSearchInput textInput textInput--rounded textInput--darkText u-baseColor--textNormal textInput--transparent" type="search" placeholder="Search" required="true" data-collection-id="c72404660798" /></label><a class="button button--chromeless is-touchIconBlackPulse u-baseColor--buttonNormal button--withIcon button--withSvgIcon button--chromeless u-verticalAlignMiddle" href="https://twitter.com/proandroiddev" title="Visit “ProAndroidDev” on X" aria-label="Visit “ProAndroidDev” on X" rel="me" target="_blank"><span class="button-defaultState"><span class="svgIcon svgIcon--twitter svgIcon--25px"><svg class="svgIcon-use" width="25" height="25" fill="none" ><path d="M14.215 11.3l5.764-6.7h-1.366l-5.005 5.818L9.611 4.6H5l6.045 8.798L5 20.424h1.366l5.286-6.144 4.221 6.144h4.61L14.216 11.3zm-1.871 2.175l-.612-.876-4.874-6.97h2.098l3.933 5.625.613.876 5.112 7.312h-2.098l-4.172-5.966z" fill="#242424"/></svg></span></span></a><a class="button button--chromeless is-touchIconBlackPulse u-baseColor--buttonNormal button--withIcon button--withSvgIcon button--chromeless u-verticalAlignMiddle" href="//facebook.com/proandroiddev" title="Visit “ProAndroidDev” on Facebook" aria-label="Visit “ProAndroidDev” on Facebook" rel="me" target="_blank"><span class="button-defaultState"><span class="svgIcon svgIcon--facebookFilled svgIcon--25px"><svg class="svgIcon-use" width="25" height="25" ><path d="M21 12.646C21 7.65 16.97 3.6 12 3.6s-9 4.05-9 9.046a9.026 9.026 0 007.59 8.924v-6.376H8.395V12.64h2.193v-1.88c0-2.186 1.328-3.375 3.267-3.375.93 0 1.728.07 1.96.1V9.77H14.47c-1.055 0-1.26.503-1.26 1.242v1.63h2.517l-.33 2.554H13.21V21.6c4.398-.597 7.79-4.373 7.79-8.954"/></svg></span></span></a><button class="button button--primary button--smallest u-noUserSelect button--withChrome u-accentColor--buttonNormal button--followCollection js-followCollectionButton" data-action="sign-up-prompt" data-sign-in-action="toggle-subscribe-collection" data-requires-token="true" data-redirect="https://medium.com/_/subscribe/collection/proandroiddev" data-action-source="header----c72404660798----------------------follow_pub"><span class="button-label button-defaultState js-buttonLabel">Follow</span><span class="button-label button-activeState">Following</span></button></div></nav></div></div></div><div class="u-marginBottom40 js-collectionStream"><div class="streamItem streamItem--section js-streamItem"><section class="u-marginTop30 u-xs-margin0 u-marginBottom15 u-maxWidth1032 u-sm-paddingLeft20 u-sm-paddingRight20 u-borderBox u-marginAuto"><div class="row u-marginTop30 u-marginLeftNegative12 u-marginRightNegative12"><div class="col u-xs-size12of12 js-trackPostPresentation u-paddingLeft12 u-marginBottom15 u-paddingRight15 u-size8of12" data-source="collection_home---4------0-----------------------" data-post-id="ff7bb40470df" data-index="0"><div class="u-lineHeightBase postItem u-marginRight3"><a href="https://proandroiddev.com/benchmarking-koin-vs-dagger-hilt-in-modern-android-development-2024-ff7bb40470df?source=collection_home---4------0-----------------------" data-action="open-post" data-action-value="https://proandroiddev.com/benchmarking-koin-vs-dagger-hilt-in-modern-android-development-2024-ff7bb40470df?source=collection_home---4------0-----------------------" class="u-block u-xs-height170 u-height350 u-width100pct u-floatLeft u-backgroundSizeCover u-backgroundOriginBorderBox u-backgroundColorGrayLight u-borderLighter" style="background-image: url(&quot;https://cdn-images-1.medium.com/max/2000/1*h5ULv-tGdDA3yD2c685lFQ.png&quot;); background-position: 50% 50% !important;"><span class="u-textScreenReader">Benchmarking Koin vs. Dagger Hilt in Modern Android Development (2024)</span></a></div></div><div class="col u-xs-marginBottom10 u-paddingLeft9 u-paddingRight12 u-paddingTop0 u-sm-paddingTop20 u-paddingBottom25 u-size4of12 u-xs-size12of12 u-marginBottom30"><a class="" href="https://proandroiddev.com/benchmarking-koin-vs-dagger-hilt-in-modern-android-development-2024-ff7bb40470df?source=collection_home---4------0-----------------------" data-action-source="collection_home---4------0-----------------------" data-post-id="ff7bb40470df"><h3 class="u-contentSansBold u-lineHeightTightest u-xs-fontSize24 u-paddingBottom2 u-paddingTop5 u-fontSize32"><div class="u-letterSpacingTight u-lineHeightTighter u-breakWord u-textOverflowEllipsis u-lineClamp4 u-fontSize30 u-size12of12 u-xs-size12of12 u-xs-fontSize24">Benchmarking Koin vs. Dagger Hilt in Modern Android Development (2024)</div></h3><div class="u-contentSansThin u-lineHeightBaseSans u-fontSize24 u-xs-fontSize18 u-textColorNormal u-baseColor--textNormal"><div class="u-fontSize18 u-letterSpacingTight u-lineHeightTight u-marginTop7 u-textColorNormal u-baseColor--textNormal">How Koin scales and performs compared to Hilt, using practical benchmarks and insights.</div></div></a><div class="u-clearfix u-marginTop20"><div class="u-flexCenter"><div class="postMetaInline-avatar u-flex0"><a class="link u-baseColor--link avatar" href="https://proandroiddev.com/@giuliani-arnaud" data-action="show-user-card" data-action-value="9ad99ca649d4" data-action-type="hover" data-user-id="9ad99ca649d4" data-collection-slug="proandroiddev" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/1*aRvmkmivw-VRIX-6wYUVCA.jpeg" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Arnaud Giuliani"></a></div><div class="postMetaInline postMetaInline-authorLockup ui-captionStrong u-flex1 u-noWrapWithEllipsis"><a class="ds-link ds-link--styleSubtle link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken" href="https://proandroiddev.com/@giuliani-arnaud" data-action="show-user-card" data-action-value="9ad99ca649d4" data-action-type="hover" data-user-id="9ad99ca649d4" data-collection-slug="proandroiddev" dir="auto">Arnaud Giuliani</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2024-11-27T02:00:21.762Z">Nov 26</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="6 min read"></span></div></div></div></div></div></div><div class="row u-marginTop15 u-marginLeftNegative12 u-marginRightNegative12"><div class="col u-xs-size12of12 js-trackPostPresentation u-paddingLeft12 u-marginBottom15 u-paddingRight12 u-size4of12" data-source="collection_home---4------1-----------------------" data-post-id="517909777921" data-index="1"><div class="u-lineHeightBase postItem"><a href="https://proandroiddev.com/a-practical-guide-to-android-interface-definition-language-aidl-with-a-real-time-example-517909777921?source=collection_home---4------1-----------------------" data-action="open-post" data-action-value="https://proandroiddev.com/a-practical-guide-to-android-interface-definition-language-aidl-with-a-real-time-example-517909777921?source=collection_home---4------1-----------------------" class="u-block u-xs-height170 u-height172 u-backgroundSizeCover u-backgroundOriginBorderBox u-backgroundColorGrayLight u-borderLighter" style="background-image: url(&quot;https://cdn-images-1.medium.com/max/800/1*bqXiu9b178PqdrckQOM31Q.png&quot;); background-position: 50% 50% !important;"><span class="u-textScreenReader">A Practical Guide to Android Interface Definition Language (AIDL) with a Real-Time Example</span></a></div><div class="col u-xs-marginBottom10 u-paddingLeft0 u-paddingRight0 u-paddingTop15 u-marginBottom30"><a class="" href="https://proandroiddev.com/a-practical-guide-to-android-interface-definition-language-aidl-with-a-real-time-example-517909777921?source=collection_home---4------1-----------------------" data-action-source="collection_home---4------1-----------------------" data-post-id="517909777921"><h3 class="u-contentSansBold u-lineHeightTightest u-xs-fontSize24 u-paddingBottom2 u-paddingTop5 u-fontSize32"><div class="u-letterSpacingTight u-lineHeightTighter u-breakWord u-textOverflowEllipsis u-lineClamp3 u-fontSize24">A Practical Guide to Android Interface Definition Language (AIDL) with a Real-Time Example</div></h3><div class="u-contentSansThin u-lineHeightBaseSans u-fontSize24 u-xs-fontSize18 u-textColorNormal u-baseColor--textNormal"><div class="u-fontSize18 u-letterSpacingTight u-lineHeightTight u-marginTop7 u-textColorNormal u-baseColor--textNormal">Android Interface Definition Language (AIDL) is a powerful tool for enabling interprocess communication (IPC) in Android applications…</div></div></a><div class="u-clearfix u-marginTop20"><div class="u-flexCenter"><div class="postMetaInline-avatar u-flex0"><a class="link u-baseColor--link avatar" href="https://proandroiddev.com/@sandeepkella23" data-action="show-user-card" data-action-value="709acf7c07e3" data-action-type="hover" data-user-id="709acf7c07e3" data-collection-slug="proandroiddev" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/1*m4ij-Lr2ZViGgYmypjtQ9A.png" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Sandeep Kella"></a></div><div class="postMetaInline postMetaInline-authorLockup ui-captionStrong u-flex1 u-noWrapWithEllipsis"><a class="ds-link ds-link--styleSubtle link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken" href="https://proandroiddev.com/@sandeepkella23" data-action="show-user-card" data-action-value="709acf7c07e3" data-action-type="hover" data-user-id="709acf7c07e3" data-collection-slug="proandroiddev" dir="auto">Sandeep Kella</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2024-11-26T17:18:48.411Z">Nov 26</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="4 min read"></span></div></div></div></div></div></div><div class="col u-xs-size12of12 js-trackPostPresentation u-paddingLeft12 u-marginBottom15 u-paddingRight12 u-size4of12" data-source="collection_home---4------2-----------------------" data-post-id="38c8cd5dc16c" data-index="2"><div class="u-lineHeightBase postItem"><a href="https://proandroiddev.com/migration-guide-from-retrofit-and-kapt-to-ktor-and-ksp-38c8cd5dc16c?source=collection_home---4------2-----------------------" data-action="open-post" data-action-value="https://proandroiddev.com/migration-guide-from-retrofit-and-kapt-to-ktor-and-ksp-38c8cd5dc16c?source=collection_home---4------2-----------------------" class="u-block u-xs-height170 u-height172 u-backgroundSizeCover u-backgroundOriginBorderBox u-backgroundColorGrayLight u-borderLighter" style="background-image: url(&quot;https://cdn-images-1.medium.com/max/800/0*K_Blg9wuGY60ti9k&quot;); background-position: 50% 50% !important;"><span class="u-textScreenReader">Migration Guide from Retrofit and KAPT to Ktor and KSP</span></a></div><div class="col u-xs-marginBottom10 u-paddingLeft0 u-paddingRight0 u-paddingTop15 u-marginBottom30"><a class="" href="https://proandroiddev.com/migration-guide-from-retrofit-and-kapt-to-ktor-and-ksp-38c8cd5dc16c?source=collection_home---4------2-----------------------" data-action-source="collection_home---4------2-----------------------" data-post-id="38c8cd5dc16c"><h3 class="u-contentSansBold u-lineHeightTightest u-xs-fontSize24 u-paddingBottom2 u-paddingTop5 u-fontSize32"><div class="u-letterSpacingTight u-lineHeightTighter u-breakWord u-textOverflowEllipsis u-lineClamp3 u-fontSize24">Migration Guide from Retrofit and KAPT to Ktor and KSP</div></h3><div class="u-contentSansThin u-lineHeightBaseSans u-fontSize24 u-xs-fontSize18 u-textColorNormal u-baseColor--textNormal"><div class="u-fontSize18 u-letterSpacingTight u-lineHeightTight u-marginTop7 u-textColorNormal u-baseColor--textNormal">Network Client and Annotation Processor migration to support Kotlin Multiplatform</div></div></a><div class="u-clearfix u-marginTop20"><div class="u-flexCenter"><div class="postMetaInline-avatar u-flex0"><a class="link u-baseColor--link avatar" href="https://proandroiddev.com/@sgkantamani" data-action="show-user-card" data-action-value="d70ea3470e6a" data-action-type="hover" data-user-id="d70ea3470e6a" data-collection-slug="proandroiddev" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/1*bVSRBKr1Pb75KQuhsPXO7g.png" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Siva Ganesh Kantamani"></a></div><div class="postMetaInline postMetaInline-authorLockup ui-captionStrong u-flex1 u-noWrapWithEllipsis"><a class="ds-link ds-link--styleSubtle link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken" href="https://proandroiddev.com/@sgkantamani" data-action="show-user-card" data-action-value="d70ea3470e6a" data-action-type="hover" data-user-id="d70ea3470e6a" data-collection-slug="proandroiddev" dir="auto">Siva Ganesh Kantamani</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2024-11-25T08:33:24.031Z">Nov 25</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="5 min read"></span></div></div></div></div></div></div><div class="col u-xs-size12of12 js-trackPostPresentation u-paddingLeft12 u-marginBottom15 u-paddingRight12 u-size4of12" data-source="collection_home---4------3-----------------------" data-post-id="2565bb90fef8" data-index="3"><div class="u-lineHeightBase postItem"><a href="https://proandroiddev.com/elevating-your-jetpack-compose-ui-with-graphicslayer-2565bb90fef8?source=collection_home---4------3-----------------------" data-action="open-post" data-action-value="https://proandroiddev.com/elevating-your-jetpack-compose-ui-with-graphicslayer-2565bb90fef8?source=collection_home---4------3-----------------------" class="u-block u-xs-height170 u-height172 u-backgroundSizeCover u-backgroundOriginBorderBox u-backgroundColorGrayLight u-borderLighter" style="background-image: url(&quot;https://cdn-images-1.medium.com/max/800/1*XeP3JED3Ubhmccah7E6hYg.jpeg&quot;); background-position: 50% 50% !important;"><span class="u-textScreenReader">Elevating Your Jetpack Compose UI with GraphicsLayer</span></a></div><div class="col u-xs-marginBottom10 u-paddingLeft0 u-paddingRight0 u-paddingTop15 u-marginBottom30"><a class="" href="https://proandroiddev.com/elevating-your-jetpack-compose-ui-with-graphicslayer-2565bb90fef8?source=collection_home---4------3-----------------------" data-action-source="collection_home---4------3-----------------------" data-post-id="2565bb90fef8"><h3 class="u-contentSansBold u-lineHeightTightest u-xs-fontSize24 u-paddingBottom2 u-paddingTop5 u-fontSize32"><div class="u-letterSpacingTight u-lineHeightTighter u-breakWord u-textOverflowEllipsis u-lineClamp3 u-fontSize24">Elevating Your Jetpack Compose UI with GraphicsLayer</div></h3><div class="u-contentSansThin u-lineHeightBaseSans u-fontSize24 u-xs-fontSize18 u-textColorNormal u-baseColor--textNormal"><div class="u-fontSize18 u-letterSpacingTight u-lineHeightTight u-marginTop7 u-textColorNormal u-baseColor--textNormal">Explore the Power of Layer-based transformations and effects</div></div></a><div class="u-clearfix u-marginTop20"><div class="u-flexCenter"><div class="postMetaInline-avatar u-flex0"><a class="link u-baseColor--link avatar" href="https://proandroiddev.com/@stefanoq21" data-action="show-user-card" data-action-value="61b66809c334" data-action-type="hover" data-user-id="61b66809c334" data-collection-slug="proandroiddev" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/1*nJT9nmRwE28kmJAEiRyHMw.png" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Stefano Natali"></a></div><div class="postMetaInline postMetaInline-authorLockup ui-captionStrong u-flex1 u-noWrapWithEllipsis"><a class="ds-link ds-link--styleSubtle link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken" href="https://proandroiddev.com/@stefanoq21" data-action="show-user-card" data-action-value="61b66809c334" data-action-type="hover" data-user-id="61b66809c334" data-collection-slug="proandroiddev" dir="auto">Stefano Natali</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2024-11-24T17:53:57.004Z">Nov 24</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="5 min read"></span></div></div></div></div></div></div></div><div class="row u-marginTop15 u-marginLeftNegative12 u-marginRightNegative12"><div class="col u-xs-size12of12 js-trackPostPresentation u-paddingLeft12 u-marginBottom15 u-paddingRight12 u-size4of12" data-source="collection_home---4------4-----------------------" data-post-id="a950e6f9eb72" data-index="4"><div class="u-lineHeightBase postItem"><a href="https://proandroiddev.com/custom-modifiers-in-jetpack-compose-a950e6f9eb72?source=collection_home---4------4-----------------------" data-action="open-post" data-action-value="https://proandroiddev.com/custom-modifiers-in-jetpack-compose-a950e6f9eb72?source=collection_home---4------4-----------------------" class="u-block u-xs-height170 u-height172 u-backgroundSizeCover u-backgroundOriginBorderBox u-backgroundColorGrayLight u-borderLighter" style="background-image: url(&quot;https://cdn-images-1.medium.com/max/800/1*Oe-DGannPg34NnFtp02TjA.png&quot;); background-position: 50% 50% !important;"><span class="u-textScreenReader">Custom modifiers in Jetpack Compose</span></a></div><div class="col u-xs-marginBottom10 u-paddingLeft0 u-paddingRight0 u-paddingTop15 u-marginBottom30"><a class="" href="https://proandroiddev.com/custom-modifiers-in-jetpack-compose-a950e6f9eb72?source=collection_home---4------4-----------------------" data-action-source="collection_home---4------4-----------------------" data-post-id="a950e6f9eb72"><h3 class="u-contentSansBold u-lineHeightTightest u-xs-fontSize24 u-paddingBottom2 u-paddingTop5 u-fontSize32"><div class="u-letterSpacingTight u-lineHeightTighter u-breakWord u-textOverflowEllipsis u-lineClamp3 u-fontSize24">Custom modifiers in Jetpack Compose</div></h3><div class="u-contentSansThin u-lineHeightBaseSans u-fontSize24 u-xs-fontSize18 u-textColorNormal u-baseColor--textNormal"><div class="u-fontSize18 u-letterSpacingTight u-lineHeightTight u-marginTop7 u-textColorNormal u-baseColor--textNormal">Modifiers in Jetpack Compose are a powerful tool for customising and enhancing UI components. They allow developers to modify the…</div></div></a><div class="u-clearfix u-marginTop20"><div class="u-flexCenter"><div class="postMetaInline-avatar u-flex0"><a class="link u-baseColor--link avatar" href="https://proandroiddev.com/@siddh.gupta99" data-action="show-user-card" data-action-value="e072cea221fc" data-action-type="hover" data-user-id="e072cea221fc" data-collection-slug="proandroiddev" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/1*6rI29yuZZDr-3XD0qlJ-RQ.jpeg" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Siddharth Gupta"></a></div><div class="postMetaInline postMetaInline-authorLockup ui-captionStrong u-flex1 u-noWrapWithEllipsis"><a class="ds-link ds-link--styleSubtle link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken" href="https://proandroiddev.com/@siddh.gupta99" data-action="show-user-card" data-action-value="e072cea221fc" data-action-type="hover" data-user-id="e072cea221fc" data-collection-slug="proandroiddev" dir="auto">Siddharth Gupta</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2024-11-22T04:11:37.520Z">Nov 21</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="5 min read"></span></div></div></div></div></div></div><div class="col u-xs-size12of12 js-trackPostPresentation u-paddingLeft12 u-marginBottom15 u-paddingRight12 u-size4of12" data-source="collection_home---4------5-----------------------" data-post-id="2dcc4db2f76c" data-index="5"><div class="u-lineHeightBase postItem"><a href="https://proandroiddev.com/widgets-with-glance-beyond-string-states-2dcc4db2f76c?source=collection_home---4------5-----------------------" data-action="open-post" data-action-value="https://proandroiddev.com/widgets-with-glance-beyond-string-states-2dcc4db2f76c?source=collection_home---4------5-----------------------" class="u-block u-xs-height170 u-height172 u-backgroundSizeCover u-backgroundOriginBorderBox u-backgroundColorGrayLight u-borderLighter" style="background-image: url(&quot;https://cdn-images-1.medium.com/max/800/1*CRseHrplJF6Df_UEDsD73g.jpeg&quot;); background-position: 50% 50% !important;"><span class="u-textScreenReader">Widgets With Glance: Beyond String States</span></a></div><div class="col u-xs-marginBottom10 u-paddingLeft0 u-paddingRight0 u-paddingTop15 u-marginBottom30"><a class="" href="https://proandroiddev.com/widgets-with-glance-beyond-string-states-2dcc4db2f76c?source=collection_home---4------5-----------------------" data-action-source="collection_home---4------5-----------------------" data-post-id="2dcc4db2f76c"><h3 class="u-contentSansBold u-lineHeightTightest u-xs-fontSize24 u-paddingBottom2 u-paddingTop5 u-fontSize32"><div class="u-letterSpacingTight u-lineHeightTighter u-breakWord u-textOverflowEllipsis u-lineClamp3 u-fontSize24">Widgets With Glance: Beyond String States</div></h3><div class="u-contentSansThin u-lineHeightBaseSans u-fontSize24 u-xs-fontSize18 u-textColorNormal u-baseColor--textNormal"><div class="u-fontSize18 u-letterSpacingTight u-lineHeightTight u-marginTop7 u-textColorNormal u-baseColor--textNormal">Use a custom GlanceStateDefinition to manage your widget state</div></div></a><div class="u-clearfix u-marginTop20"><div class="u-flexCenter"><div class="postMetaInline-avatar u-flex0"><a class="link u-baseColor--link avatar" href="https://proandroiddev.com/@katiebarnett5" data-action="show-user-card" data-action-value="6d77f07dc67" data-action-type="hover" data-user-id="6d77f07dc67" data-collection-slug="proandroiddev" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/1*5UmMOU3BxA7gSCobglh6zw.png" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Katie Barnett"></a></div><div class="postMetaInline postMetaInline-authorLockup ui-captionStrong u-flex1 u-noWrapWithEllipsis"><a class="ds-link ds-link--styleSubtle link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken" href="https://proandroiddev.com/@katiebarnett5" data-action="show-user-card" data-action-value="6d77f07dc67" data-action-type="hover" data-user-id="6d77f07dc67" data-collection-slug="proandroiddev" dir="auto">Katie Barnett</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2024-11-21T07:03:53.504Z">Nov 20</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="5 min read"></span></div></div></div></div></div></div><div class="col u-xs-size12of12 js-trackPostPresentation u-paddingLeft12 u-marginBottom15 u-paddingRight12 u-size4of12" data-source="collection_home---4------6-----------------------" data-post-id="aa0760383569" data-index="6"><div class="u-lineHeightBase postItem"><a href="https://proandroiddev.com/exploring-kotlin-coroutines-through-output-questions-aa0760383569?source=collection_home---4------6-----------------------" data-action="open-post" data-action-value="https://proandroiddev.com/exploring-kotlin-coroutines-through-output-questions-aa0760383569?source=collection_home---4------6-----------------------" class="u-block u-xs-height170 u-height172 u-backgroundSizeCover u-backgroundOriginBorderBox u-backgroundColorGrayLight u-borderLighter" style="background-image: url(&quot;https://cdn-images-1.medium.com/max/800/1*qgzGgrMeE9raugNDYbsfVQ.png&quot;); background-position: 50% 50% !important;"><span class="u-textScreenReader">Exploring Kotlin Coroutines through Output Questions</span></a></div><div class="col u-xs-marginBottom10 u-paddingLeft0 u-paddingRight0 u-paddingTop15 u-marginBottom30"><a class="" href="https://proandroiddev.com/exploring-kotlin-coroutines-through-output-questions-aa0760383569?source=collection_home---4------6-----------------------" data-action-source="collection_home---4------6-----------------------" data-post-id="aa0760383569"><h3 class="u-contentSansBold u-lineHeightTightest u-xs-fontSize24 u-paddingBottom2 u-paddingTop5 u-fontSize32"><div class="u-letterSpacingTight u-lineHeightTighter u-breakWord u-textOverflowEllipsis u-lineClamp3 u-fontSize24">Exploring Kotlin Coroutines through Output Questions</div></h3><div class="u-contentSansThin u-lineHeightBaseSans u-fontSize24 u-xs-fontSize18 u-textColorNormal u-baseColor--textNormal"><div class="u-fontSize18 u-letterSpacingTight u-lineHeightTight u-marginTop7 u-textColorNormal u-baseColor--textNormal">In this unique blog, we delve into the world of Kotlin coroutines through a series of output questions. Each question presents a distinct…</div></div></a><div class="u-clearfix u-marginTop20"><div class="u-flexCenter"><div class="postMetaInline-avatar u-flex0"><a class="link u-baseColor--link avatar" href="https://proandroiddev.com/@tanyandroid" data-action="show-user-card" data-action-value="4369a38c1d4f" data-action-type="hover" data-user-id="4369a38c1d4f" data-collection-slug="proandroiddev" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/1*yEkfsQNgR3VHbOT2VzHrIg.jpeg" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Tanya Arora"></a></div><div class="postMetaInline postMetaInline-authorLockup ui-captionStrong u-flex1 u-noWrapWithEllipsis"><a class="ds-link ds-link--styleSubtle link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken" href="https://proandroiddev.com/@tanyandroid" data-action="show-user-card" data-action-value="4369a38c1d4f" data-action-type="hover" data-user-id="4369a38c1d4f" data-collection-slug="proandroiddev" dir="auto">Tanya Arora</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2024-11-16T06:27:45.538Z">Nov 15</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="10 min read"></span></div></div></div></div></div></div></div></section></div><div class="streamItem streamItem--section js-streamItem"><section class="u-marginTop30 u-xs-margin0 u-marginBottom15 u-maxWidth1032 u-sm-paddingLeft20 u-sm-paddingRight20 u-borderBox u-marginAuto"><header class="heading heading--borderedBottom u-fontSize18 u-contentSansThin" ><div class="u-clearfix"><div class="heading-content u-floatLeft"><span class="heading-title heading-title--dark heading-title--lineHeightTight u-fontSize18 u-contentSansThin">Trending Blogs</span></div></div></header><div class="row u-marginTop30 u-marginLeftNegative12 u-marginRightNegative12"><div class="col u-xs-size12of12 js-trackPostPresentation u-paddingLeft12 u-marginBottom15 u-paddingRight12 u-size4of12" data-source="collection_home---4------0-----------------------" data-post-id="187d5e14d212" data-index="0"><div class="u-lineHeightBase postItem"><a href="https://proandroiddev.com/top-10-coroutine-mistakes-we-all-have-made-as-android-developers-187d5e14d212?source=collection_home---4------0-----------------------" data-action="open-post" data-action-value="https://proandroiddev.com/top-10-coroutine-mistakes-we-all-have-made-as-android-developers-187d5e14d212?source=collection_home---4------0-----------------------" class="u-block u-xs-height170 u-height172 u-backgroundSizeCover u-backgroundOriginBorderBox u-backgroundColorGrayLight u-borderLighter" style="background-image: url(&quot;https://cdn-images-1.medium.com/max/800/1*Bhfzsp01NibPkNYmWy9YyA.png&quot;); background-position: 50% 50% !important;"><span class="u-textScreenReader">Top 10 Coroutine Mistakes We All Have Made as Android Developers</span></a></div><div class="col u-xs-marginBottom10 u-paddingLeft0 u-paddingRight0 u-paddingTop15 u-marginBottom30"><a class="" href="https://proandroiddev.com/top-10-coroutine-mistakes-we-all-have-made-as-android-developers-187d5e14d212?source=collection_home---4------0-----------------------" data-action-source="collection_home---4------0-----------------------" data-post-id="187d5e14d212"><h3 class="u-contentSansBold u-lineHeightTightest u-xs-fontSize24 u-paddingBottom2 u-paddingTop5 u-fontSize32"><div class="u-letterSpacingTight u-lineHeightTighter u-breakWord u-textOverflowEllipsis u-lineClamp3 u-fontSize24">Top 10 Coroutine Mistakes We All Have Made as Android Developers</div></h3><div class="u-contentSansThin u-lineHeightBaseSans u-fontSize24 u-xs-fontSize18 u-textColorNormal u-baseColor--textNormal"><div class="u-fontSize18 u-letterSpacingTight u-lineHeightTight u-marginTop7 u-textColorNormal u-baseColor--textNormal">Understanding and Avoiding Common Pitfalls in Asynchronous Programming with Kotlin Coroutines</div></div></a><div class="u-clearfix u-marginTop20"><div class="u-flexCenter"><div class="postMetaInline-avatar u-flex0"><a class="link u-baseColor--link avatar" href="https://proandroiddev.com/@dobri.kostadinov" data-action="show-user-card" data-action-value="cb954442a18e" data-action-type="hover" data-user-id="cb954442a18e" data-collection-slug="proandroiddev" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/1*PDWUz7RmoqP9kmFnZzGPUg.jpeg" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Dobri Kostadinov"></a></div><div class="postMetaInline postMetaInline-authorLockup ui-captionStrong u-flex1 u-noWrapWithEllipsis"><a class="ds-link ds-link--styleSubtle link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken" href="https://proandroiddev.com/@dobri.kostadinov" data-action="show-user-card" data-action-value="cb954442a18e" data-action-type="hover" data-user-id="cb954442a18e" data-collection-slug="proandroiddev" dir="auto">Dobri Kostadinov</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2024-11-03T17:30:21.474Z">Nov 3</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="5 min read"></span></div></div></div></div></div></div><div class="col u-xs-size12of12 js-trackPostPresentation u-paddingLeft12 u-marginBottom15 u-paddingRight12 u-size4of12" data-source="collection_home---4------1-----------------------" data-post-id="05e8fe2acd2c" data-index="1"><div class="u-lineHeightBase postItem"><a href="https://proandroiddev.com/top-9-android-developer-interview-questions-you-should-know-05e8fe2acd2c?source=collection_home---4------1-----------------------" data-action="open-post" data-action-value="https://proandroiddev.com/top-9-android-developer-interview-questions-you-should-know-05e8fe2acd2c?source=collection_home---4------1-----------------------" class="u-block u-xs-height170 u-height172 u-backgroundSizeCover u-backgroundOriginBorderBox u-backgroundColorGrayLight u-borderLighter" style="background-image: url(&quot;https://cdn-images-1.medium.com/max/800/1*QhM1jZ56sVMbyc0hgOgRPw.jpeg&quot;); background-position: 50% 50% !important;"><span class="u-textScreenReader">Top Nine Android Developer Interview Questions You Should Know</span></a></div><div class="col u-xs-marginBottom10 u-paddingLeft0 u-paddingRight0 u-paddingTop15 u-marginBottom30"><a class="" href="https://proandroiddev.com/top-9-android-developer-interview-questions-you-should-know-05e8fe2acd2c?source=collection_home---4------1-----------------------" data-action-source="collection_home---4------1-----------------------" data-post-id="05e8fe2acd2c"><h3 class="u-contentSansBold u-lineHeightTightest u-xs-fontSize24 u-paddingBottom2 u-paddingTop5 u-fontSize32"><div class="u-letterSpacingTight u-lineHeightTighter u-breakWord u-textOverflowEllipsis u-lineClamp3 u-fontSize24">Top Nine Android Developer Interview Questions You Should Know</div></h3><div class="u-contentSansThin u-lineHeightBaseSans u-fontSize24 u-xs-fontSize18 u-textColorNormal u-baseColor--textNormal"><div class="u-fontSize18 u-letterSpacingTight u-lineHeightTight u-marginTop7 u-textColorNormal u-baseColor--textNormal">When applying for a job as an Android developer, you’ll need expertise in Android, Kotlin, and other relevant skills, depending on the team…</div></div></a><div class="u-clearfix u-marginTop20"><div class="u-flexCenter"><div class="postMetaInline-avatar u-flex0"><a class="link u-baseColor--link avatar" href="https://proandroiddev.com/@skydoves" data-action="show-user-card" data-action-value="9bb203a4ab2e" data-action-type="hover" data-user-id="9bb203a4ab2e" data-collection-slug="proandroiddev" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/1*to22-X47VSP4tZeElwVKKA.png" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Jaewoong Eum"></a></div><div class="postMetaInline postMetaInline-authorLockup ui-captionStrong u-flex1 u-noWrapWithEllipsis"><a class="ds-link ds-link--styleSubtle link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken" href="https://proandroiddev.com/@skydoves" data-action="show-user-card" data-action-value="9bb203a4ab2e" data-action-type="hover" data-user-id="9bb203a4ab2e" data-collection-slug="proandroiddev" dir="auto">Jaewoong Eum</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2024-11-09T01:09:50.956Z">Nov 8</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="15 min read"></span></div></div></div></div></div></div><div class="col u-xs-size12of12 js-trackPostPresentation u-paddingLeft12 u-marginBottom15 u-paddingRight12 u-size4of12" data-source="collection_home---4------2-----------------------" data-post-id="12f6a9939053" data-index="2"><div class="u-lineHeightBase postItem"><a href="https://proandroiddev.com/the-2-best-ways-to-secure-your-api-keys-in-android-projects-12f6a9939053?source=collection_home---4------2-----------------------" data-action="open-post" data-action-value="https://proandroiddev.com/the-2-best-ways-to-secure-your-api-keys-in-android-projects-12f6a9939053?source=collection_home---4------2-----------------------" class="u-block u-xs-height170 u-height172 u-backgroundSizeCover u-backgroundOriginBorderBox u-backgroundColorGrayLight u-borderLighter" style="background-image: url(&quot;https://cdn-images-1.medium.com/max/800/1*ba3JJ-JCIWGZJi94UTnThw.png&quot;); background-position: 50% 50% !important;"><span class="u-textScreenReader">The two best ways to secure your API keys in Android projects</span></a></div><div class="col u-xs-marginBottom10 u-paddingLeft0 u-paddingRight0 u-paddingTop15 u-marginBottom30"><a class="" href="https://proandroiddev.com/the-2-best-ways-to-secure-your-api-keys-in-android-projects-12f6a9939053?source=collection_home---4------2-----------------------" data-action-source="collection_home---4------2-----------------------" data-post-id="12f6a9939053"><h3 class="u-contentSansBold u-lineHeightTightest u-xs-fontSize24 u-paddingBottom2 u-paddingTop5 u-fontSize32"><div class="u-letterSpacingTight u-lineHeightTighter u-breakWord u-textOverflowEllipsis u-lineClamp3 u-fontSize24">The two best ways to secure your API keys in Android projects</div></h3><div class="u-contentSansThin u-lineHeightBaseSans u-fontSize24 u-xs-fontSize18 u-textColorNormal u-baseColor--textNormal"><div class="u-fontSize18 u-letterSpacingTight u-lineHeightTight u-marginTop7 u-textColorNormal u-baseColor--textNormal">Protecting your Android app’s API keys ensures the privacy of user information and secures any unauthorized access to your APIs, this is…</div></div></a><div class="u-clearfix u-marginTop20"><div class="u-flexCenter"><div class="postMetaInline-avatar u-flex0"><a class="link u-baseColor--link avatar" href="https://proandroiddev.com/@sagar0-0" data-action="show-user-card" data-action-value="b48b9b0e3d4d" data-action-type="hover" data-user-id="b48b9b0e3d4d" data-collection-slug="proandroiddev" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/1*PCJVPFHPX_oQ4eILPEDSag.jpeg" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Sagar Malhotra"></a></div><div class="postMetaInline postMetaInline-authorLockup ui-captionStrong u-flex1 u-noWrapWithEllipsis"><a class="ds-link ds-link--styleSubtle link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken" href="https://proandroiddev.com/@sagar0-0" data-action="show-user-card" data-action-value="b48b9b0e3d4d" data-action-type="hover" data-user-id="b48b9b0e3d4d" data-collection-slug="proandroiddev" dir="auto">Sagar Malhotra</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2024-11-04T16:28:42.201Z">Nov 4</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="5 min read"></span></div></div></div></div></div></div></div><div class="row u-marginTop30 u-marginLeftNegative12 u-marginRightNegative12"><div class="col u-xs-size12of12 js-trackPostPresentation u-paddingLeft12 u-marginBottom15 u-paddingRight12 u-size4of12" data-source="collection_home---4------3-----------------------" data-post-id="14d04ec2426a" data-index="3"><div class="u-lineHeightBase postItem"><a href="https://proandroiddev.com/mastering-android-viewmodels-essential-dos-and-donts-part-5-%EF%B8%8F5%EF%B8%8F%E2%83%A3-14d04ec2426a?source=collection_home---4------3-----------------------" data-action="open-post" data-action-value="https://proandroiddev.com/mastering-android-viewmodels-essential-dos-and-donts-part-5-%EF%B8%8F5%EF%B8%8F%E2%83%A3-14d04ec2426a?source=collection_home---4------3-----------------------" class="u-block u-xs-height170 u-height172 u-backgroundSizeCover u-backgroundOriginBorderBox u-backgroundColorGrayLight u-borderLighter" style="background-image: url(&quot;https://cdn-images-1.medium.com/max/800/1*XDoCaRPSQa-h0DqkT5ckmA.png&quot;); background-position: 50% 50% !important;"><span class="u-textScreenReader">Mastering Android ViewModels: Essential Dos and Don’ts Part 5 🛠️5️⃣</span></a></div><div class="col u-xs-marginBottom10 u-paddingLeft0 u-paddingRight0 u-paddingTop15 u-marginBottom30"><a class="" href="https://proandroiddev.com/mastering-android-viewmodels-essential-dos-and-donts-part-5-%EF%B8%8F5%EF%B8%8F%E2%83%A3-14d04ec2426a?source=collection_home---4------3-----------------------" data-action-source="collection_home---4------3-----------------------" data-post-id="14d04ec2426a"><h3 class="u-contentSansBold u-lineHeightTightest u-xs-fontSize24 u-paddingBottom2 u-paddingTop5 u-fontSize32"><div class="u-letterSpacingTight u-lineHeightTighter u-breakWord u-textOverflowEllipsis u-lineClamp3 u-fontSize24">Mastering Android ViewModels: Essential Dos and Don’ts Part 5 🛠️5️⃣</div></h3><div class="u-contentSansThin u-lineHeightBaseSans u-fontSize24 u-xs-fontSize18 u-textColorNormal u-baseColor--textNormal"><div class="u-fontSize18 u-letterSpacingTight u-lineHeightTight u-marginTop7 u-textColorNormal u-baseColor--textNormal">keep these in mind for better code quality when doing ViewModels!</div></div></a><div class="u-clearfix u-marginTop20"><div class="u-flexCenter"><div class="postMetaInline-avatar u-flex0"><a class="link u-baseColor--link avatar" href="https://proandroiddev.com/@mrnajafi" data-action="show-user-card" data-action-value="4ced6b06c2b7" data-action-type="hover" data-user-id="4ced6b06c2b7" data-collection-slug="proandroiddev" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/1*T95Zeqgg_vm1yNzTq7I3Jg.png" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Reza"></a></div><div class="postMetaInline postMetaInline-authorLockup ui-captionStrong u-flex1 u-noWrapWithEllipsis"><a class="ds-link ds-link--styleSubtle link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken" href="https://proandroiddev.com/@mrnajafi" data-action="show-user-card" data-action-value="4ced6b06c2b7" data-action-type="hover" data-user-id="4ced6b06c2b7" data-collection-slug="proandroiddev" dir="auto">Reza</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2024-10-26T20:33:01.088Z">Oct 26</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="4 min read"></span></div></div></div></div></div></div><div class="col u-xs-size12of12 js-trackPostPresentation u-paddingLeft12 u-marginBottom15 u-paddingRight12 u-size4of12" data-source="collection_home---4------4-----------------------" data-post-id="138d3496c624" data-index="4"><div class="u-lineHeightBase postItem"><a href="https://proandroiddev.com/animation-and-masking-in-jetpack-compose-with-the-grahpicslayer-and-drawing-modifiers-138d3496c624?source=collection_home---4------4-----------------------" data-action="open-post" data-action-value="https://proandroiddev.com/animation-and-masking-in-jetpack-compose-with-the-grahpicslayer-and-drawing-modifiers-138d3496c624?source=collection_home---4------4-----------------------" class="u-block u-xs-height170 u-height172 u-backgroundSizeCover u-backgroundOriginBorderBox u-backgroundColorGrayLight u-borderLighter" style="background-image: url(&quot;https://cdn-images-1.medium.com/max/800/1*KALhC6r9lo-8E_M7QGVvhw.png&quot;); background-position: 50% 50% !important;"><span class="u-textScreenReader">Animation and Masking in Jetpack Compose with the grahpicsLayer() and Drawing Modifiers</span></a></div><div class="col u-xs-marginBottom10 u-paddingLeft0 u-paddingRight0 u-paddingTop15 u-marginBottom30"><a class="" href="https://proandroiddev.com/animation-and-masking-in-jetpack-compose-with-the-grahpicslayer-and-drawing-modifiers-138d3496c624?source=collection_home---4------4-----------------------" data-action-source="collection_home---4------4-----------------------" data-post-id="138d3496c624"><h3 class="u-contentSansBold u-lineHeightTightest u-xs-fontSize24 u-paddingBottom2 u-paddingTop5 u-fontSize32"><div class="u-letterSpacingTight u-lineHeightTighter u-breakWord u-textOverflowEllipsis u-lineClamp3 u-fontSize24">Animation and Masking in Jetpack Compose with the grahpicsLayer() and Drawing Modifiers</div></h3><div class="u-contentSansThin u-lineHeightBaseSans u-fontSize24 u-xs-fontSize18 u-textColorNormal u-baseColor--textNormal"><div class="u-fontSize18 u-letterSpacingTight u-lineHeightTight u-marginTop7 u-textColorNormal u-baseColor--textNormal">Using the graphicsLayer(), CompositingStrategy and drawing modifiers for masking and animating content in Jetpack Compose.</div></div></a><div class="u-clearfix u-marginTop20"><div class="u-flexCenter"><div class="postMetaInline-avatar u-flex0"><a class="link u-baseColor--link avatar" href="https://proandroiddev.com/@omarsahl" data-action="show-user-card" data-action-value="727137e47bff" data-action-type="hover" data-user-id="727137e47bff" data-collection-slug="proandroiddev" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/1*TB_nVStV_doFD3tJYIwjsA@2x.jpeg" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Omar Sahl"></a></div><div class="postMetaInline postMetaInline-authorLockup ui-captionStrong u-flex1 u-noWrapWithEllipsis"><a class="ds-link ds-link--styleSubtle link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken" href="https://proandroiddev.com/@omarsahl" data-action="show-user-card" data-action-value="727137e47bff" data-action-type="hover" data-user-id="727137e47bff" data-collection-slug="proandroiddev" dir="auto">Omar Sahl</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2024-09-22T21:08:50.503Z">Sep 22</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="12 min read"></span></div></div></div></div></div></div><div class="col u-xs-size12of12 js-trackPostPresentation u-paddingLeft12 u-marginBottom15 u-paddingRight12 u-size4of12" data-source="collection_home---4------5-----------------------" data-post-id="07ca74eee000" data-index="5"><div class="u-lineHeightBase postItem"><a href="https://proandroiddev.com/android-interview-series-2024-part-8-android-architecture-07ca74eee000?source=collection_home---4------5-----------------------" data-action="open-post" data-action-value="https://proandroiddev.com/android-interview-series-2024-part-8-android-architecture-07ca74eee000?source=collection_home---4------5-----------------------" class="u-block u-xs-height170 u-height172 u-backgroundSizeCover u-backgroundOriginBorderBox u-backgroundColorGrayLight u-borderLighter" style="background-image: url(&quot;https://cdn-images-1.medium.com/max/800/0*ovGMYgU7aA9In-oV.jpeg&quot;); background-position: 50% 50% !important;"><span class="u-textScreenReader">Android Interview Series 2024 — Part 8 (Android architecture)</span></a></div><div class="col u-xs-marginBottom10 u-paddingLeft0 u-paddingRight0 u-paddingTop15 u-marginBottom30"><a class="" href="https://proandroiddev.com/android-interview-series-2024-part-8-android-architecture-07ca74eee000?source=collection_home---4------5-----------------------" data-action-source="collection_home---4------5-----------------------" data-post-id="07ca74eee000"><h3 class="u-contentSansBold u-lineHeightTightest u-xs-fontSize24 u-paddingBottom2 u-paddingTop5 u-fontSize32"><div class="u-letterSpacingTight u-lineHeightTighter u-breakWord u-textOverflowEllipsis u-lineClamp3 u-fontSize24">Android Interview Series 2024 — Part 8 (Android architecture)</div></h3><div class="u-contentSansThin u-lineHeightBaseSans u-fontSize24 u-xs-fontSize18 u-textColorNormal u-baseColor--textNormal"><div class="u-fontSize18 u-letterSpacingTight u-lineHeightTight u-marginTop7 u-textColorNormal u-baseColor--textNormal">This is Part 8 of the android interview question series. This part will focus on Android architecture.</div></div></a><div class="u-clearfix u-marginTop20"><div class="u-flexCenter"><div class="postMetaInline-avatar u-flex0"><a class="link u-baseColor--link avatar" href="https://proandroiddev.com/@anitaa_1990" data-action="show-user-card" data-action-value="b69ba9cd4ff2" data-action-type="hover" data-user-id="b69ba9cd4ff2" data-collection-slug="proandroiddev" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/1*062ZoiVn_WJIT9PYUS4yww.jpeg" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Anitaa Murthy"></a></div><div class="postMetaInline postMetaInline-authorLockup ui-captionStrong u-flex1 u-noWrapWithEllipsis"><a class="ds-link ds-link--styleSubtle link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken" href="https://proandroiddev.com/@anitaa_1990" data-action="show-user-card" data-action-value="b69ba9cd4ff2" data-action-type="hover" data-user-id="b69ba9cd4ff2" data-collection-slug="proandroiddev" dir="auto">Anitaa Murthy</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2024-11-12T16:01:45.001Z">Nov 12</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="8 min read"></span></div></div></div></div></div></div></div><div class="row u-marginTop30 u-marginLeftNegative12 u-marginRightNegative12"><div class="col u-xs-size12of12 js-trackPostPresentation u-paddingLeft12 u-marginBottom15 u-paddingRight12 u-size4of12" data-source="collection_home---4------6-----------------------" data-post-id="08927e4d2855" data-index="6"><div class="u-lineHeightBase postItem"><a href="https://proandroiddev.com/facing-a-multithreading-tech-interview-08927e4d2855?source=collection_home---4------6-----------------------" data-action="open-post" data-action-value="https://proandroiddev.com/facing-a-multithreading-tech-interview-08927e4d2855?source=collection_home---4------6-----------------------" class="u-block u-xs-height170 u-height172 u-backgroundSizeCover u-backgroundOriginBorderBox u-backgroundColorGrayLight u-borderLighter" style="background-image: url(&quot;https://cdn-images-1.medium.com/max/800/0*wnibk_XT8sI6BUCk&quot;); background-position: 50% 50% !important;"><span class="u-textScreenReader">Facing a Multithreading Tech Interview</span></a></div><div class="col u-xs-marginBottom10 u-paddingLeft0 u-paddingRight0 u-paddingTop15 u-marginBottom30"><a class="" href="https://proandroiddev.com/facing-a-multithreading-tech-interview-08927e4d2855?source=collection_home---4------6-----------------------" data-action-source="collection_home---4------6-----------------------" data-post-id="08927e4d2855"><h3 class="u-contentSansBold u-lineHeightTightest u-xs-fontSize24 u-paddingBottom2 u-paddingTop5 u-fontSize32"><div class="u-letterSpacingTight u-lineHeightTighter u-breakWord u-textOverflowEllipsis u-lineClamp3 u-fontSize24">Facing a Multithreading Tech Interview</div></h3><div class="u-contentSansThin u-lineHeightBaseSans u-fontSize24 u-xs-fontSize18 u-textColorNormal u-baseColor--textNormal"><div class="u-fontSize18 u-letterSpacingTight u-lineHeightTight u-marginTop7 u-textColorNormal u-baseColor--textNormal">Lessons from a Live Coding Session</div></div></a><div class="u-clearfix u-marginTop20"><div class="u-flexCenter"><div class="postMetaInline-avatar u-flex0"><a class="link u-baseColor--link avatar" href="https://proandroiddev.com/@andriyveremiyenko" data-action="show-user-card" data-action-value="55eb0bd9ca57" data-action-type="hover" data-user-id="55eb0bd9ca57" data-collection-slug="proandroiddev" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/1*_zSSttSTG1UslDuGUKvNvg.jpeg" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Andrii Veremiienko"></a></div><div class="postMetaInline postMetaInline-authorLockup ui-captionStrong u-flex1 u-noWrapWithEllipsis"><a class="ds-link ds-link--styleSubtle link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken" href="https://proandroiddev.com/@andriyveremiyenko" data-action="show-user-card" data-action-value="55eb0bd9ca57" data-action-type="hover" data-user-id="55eb0bd9ca57" data-collection-slug="proandroiddev" dir="auto">Andrii Veremiienko</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2024-10-14T05:18:54.781Z">Oct 13</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="4 min read"></span></div></div></div></div></div></div><div class="col u-xs-size12of12 js-trackPostPresentation u-paddingLeft12 u-marginBottom15 u-paddingRight12 u-size4of12" data-source="collection_home---4------7-----------------------" data-post-id="14d04ea18e1a" data-index="7"><div class="u-lineHeightBase postItem"><a href="https://proandroiddev.com/how-to-use-koin-scopes-with-decompose-components-14d04ea18e1a?source=collection_home---4------7-----------------------" data-action="open-post" data-action-value="https://proandroiddev.com/how-to-use-koin-scopes-with-decompose-components-14d04ea18e1a?source=collection_home---4------7-----------------------" class="u-block u-xs-height170 u-height172 u-backgroundSizeCover u-backgroundOriginBorderBox u-backgroundColorGrayLight u-borderLighter" style="background-image: url(&quot;https://cdn-images-1.medium.com/max/800/0*eru2Zt27h8fGOHgx&quot;); background-position: 50% 50% !important;"><span class="u-textScreenReader">How to use Koin scopes with Decompose components?</span></a></div><div class="col u-xs-marginBottom10 u-paddingLeft0 u-paddingRight0 u-paddingTop15 u-marginBottom30"><a class="" href="https://proandroiddev.com/how-to-use-koin-scopes-with-decompose-components-14d04ea18e1a?source=collection_home---4------7-----------------------" data-action-source="collection_home---4------7-----------------------" data-post-id="14d04ea18e1a"><h3 class="u-contentSansBold u-lineHeightTightest u-xs-fontSize24 u-paddingBottom2 u-paddingTop5 u-fontSize32"><div class="u-letterSpacingTight u-lineHeightTighter u-breakWord u-textOverflowEllipsis u-lineClamp3 u-fontSize24">How to use Koin scopes with Decompose components?</div></h3><div class="u-contentSansThin u-lineHeightBaseSans u-fontSize24 u-xs-fontSize18 u-textColorNormal u-baseColor--textNormal"><div class="u-fontSize18 u-letterSpacingTight u-lineHeightTight u-marginTop7 u-textColorNormal u-baseColor--textNormal">In this article I’d like to share the approach of how I resolved the issue with the registration of the big amount of named dependencies by…</div></div></a><div class="u-clearfix u-marginTop20"><div class="u-flexCenter"><div class="postMetaInline-avatar u-flex0"><a class="link u-baseColor--link avatar" href="https://proandroiddev.com/@mikhailovskii.sergei" data-action="show-user-card" data-action-value="bc628276716f" data-action-type="hover" data-user-id="bc628276716f" data-collection-slug="proandroiddev" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/0*pQI7CRTSrlmr4iRF.jpg" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Sergei Mikhailovskii"></a></div><div class="postMetaInline postMetaInline-authorLockup ui-captionStrong u-flex1 u-noWrapWithEllipsis"><a class="ds-link ds-link--styleSubtle link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken" href="https://proandroiddev.com/@mikhailovskii.sergei" data-action="show-user-card" data-action-value="bc628276716f" data-action-type="hover" data-user-id="bc628276716f" data-collection-slug="proandroiddev" dir="auto">Sergei Mikhailovskii</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2024-11-04T21:47:34.384Z">Nov 4</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="3 min read"></span></div></div></div></div></div></div><div class="col u-xs-size12of12 js-trackPostPresentation u-paddingLeft12 u-marginBottom15 u-paddingRight12 u-size4of12" data-source="collection_home---4------8-----------------------" data-post-id="0f621bfd06a0" data-index="8"><div class="u-lineHeightBase postItem"><a href="https://proandroiddev.com/loading-initial-data-part-2-clear-all-your-doubts-0f621bfd06a0?source=collection_home---4------8-----------------------" data-action="open-post" data-action-value="https://proandroiddev.com/loading-initial-data-part-2-clear-all-your-doubts-0f621bfd06a0?source=collection_home---4------8-----------------------" class="u-block u-xs-height170 u-height172 u-backgroundSizeCover u-backgroundOriginBorderBox u-backgroundColorGrayLight u-borderLighter" style="background-image: url(&quot;https://cdn-images-1.medium.com/max/800/1*GQIpQqipXEDa1RQm05B4Ig.jpeg&quot;); background-position: 50% 50% !important;"><span class="u-textScreenReader">Loading Initial Data on Android Part 2: Clear All Your Doubts</span></a></div><div class="col u-xs-marginBottom10 u-paddingLeft0 u-paddingRight0 u-paddingTop15 u-marginBottom30"><a class="" href="https://proandroiddev.com/loading-initial-data-part-2-clear-all-your-doubts-0f621bfd06a0?source=collection_home---4------8-----------------------" data-action-source="collection_home---4------8-----------------------" data-post-id="0f621bfd06a0"><h3 class="u-contentSansBold u-lineHeightTightest u-xs-fontSize24 u-paddingBottom2 u-paddingTop5 u-fontSize32"><div class="u-letterSpacingTight u-lineHeightTighter u-breakWord u-textOverflowEllipsis u-lineClamp3 u-fontSize24">Loading Initial Data on Android Part 2: Clear All Your Doubts</div></h3><div class="u-contentSansThin u-lineHeightBaseSans u-fontSize24 u-xs-fontSize18 u-textColorNormal u-baseColor--textNormal"><div class="u-fontSize18 u-letterSpacingTight u-lineHeightTight u-marginTop7 u-textColorNormal u-baseColor--textNormal">When a user enters a screen, the default data should be fetched by triggering the business logic, whether from the network or local…</div></div></a><div class="u-clearfix u-marginTop20"><div class="u-flexCenter"><div class="postMetaInline-avatar u-flex0"><a class="link u-baseColor--link avatar" href="https://proandroiddev.com/@skydoves" data-action="show-user-card" data-action-value="9bb203a4ab2e" data-action-type="hover" data-user-id="9bb203a4ab2e" data-collection-slug="proandroiddev" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/1*to22-X47VSP4tZeElwVKKA.png" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Jaewoong Eum"></a></div><div class="postMetaInline postMetaInline-authorLockup ui-captionStrong u-flex1 u-noWrapWithEllipsis"><a class="ds-link ds-link--styleSubtle link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken" href="https://proandroiddev.com/@skydoves" data-action="show-user-card" data-action-value="9bb203a4ab2e" data-action-type="hover" data-user-id="9bb203a4ab2e" data-collection-slug="proandroiddev" dir="auto">Jaewoong Eum</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2024-09-20T13:34:36.468Z">Sep 20</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="8 min read"></span></div></div></div></div></div></div></div></section></div></div><style class="js-collectionStyle"> .u-accentColor--borderLight {border-color: #2E987E !important;} .u-accentColor--borderNormal {border-color: #2E987E !important;} .u-accentColor--borderDark {border-color: #32826C !important;} .u-accentColor--iconLight .svgIcon,.u-accentColor--iconLight.svgIcon {fill: #2E987E !important;} .u-accentColor--iconNormal .svgIcon,.u-accentColor--iconNormal.svgIcon {fill: #2E987E !important;} .u-accentColor--iconDark .svgIcon,.u-accentColor--iconDark.svgIcon {fill: #32826C !important;} .u-accentColor--textNormal {color: #32826C !important;} .u-accentColor--hoverTextNormal:hover {color: #32826C !important;} .u-accentColor--textNormal.u-accentColor--textDarken:hover {color: #327663 !important;} .u-accentColor--textDark {color: #327663 !important;} .u-accentColor--backgroundLight {background-color: #2E987E !important;} .u-accentColor--backgroundNormal {background-color: #2E987E !important;} .u-accentColor--backgroundDark {background-color: #32826C !important;} .u-accentColor--buttonDark {border-color: #32826C !important; color: #327663 !important;} .u-accentColor--buttonDark:hover {border-color: #327663 !important;} .u-accentColor--buttonDark .icon:before,.u-accentColor--buttonDark .svgIcon{color: #32826C !important; fill: #32826C !important;} .u-accentColor--buttonNormal:not(.clapButton--largePill) {border-color: #2E987E !important; color: #32826C !important;} .u-accentColor--buttonNormal:hover {border-color: #32826C !important;} .u-accentColor--buttonNormal .icon:before,.u-accentColor--buttonNormal .svgIcon{color: #2E987E !important; fill: #2E987E !important;} .u-accentColor--buttonNormal.button--filled .icon:before,.u-accentColor--buttonNormal.button--filled .svgIcon{color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;} .u-accentColor--buttonDark.button--filled,.u-accentColor--buttonDark.button--withChrome.is-active,.u-accentColor--fillWhenActive.is-active {background-color: #32826C !important; border-color: #32826C !important; color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;} .u-accentColor--buttonNormal.button--filled:not(.clapButton--largePill),.u-accentColor--buttonNormal.button--withChrome.is-active:not(.clapButton--largePill) {background-color: #2E987E !important; border-color: #2E987E !important; color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;} .postArticle.is-withAccentColors .markup--user,.postArticle.is-withAccentColors .markup--query {color: #32826C !important;}.u-tintBgColor {background-color: rgba(125, 225, 195, 1) !important;}.u-tintBgColor .u-fadeLeft:before {background-image: linear-gradient(to right, rgba(125, 225, 195, 1) 0%, rgba(125, 225, 195, 0) 100%) !important;}.u-tintBgColor .u-fadeRight:after {background-image: linear-gradient(to right, rgba(125, 225, 195, 0) 0%, rgba(125, 225, 195, 1) 100%) !important;} .u-tintSpectrum .u-baseColor--borderLight {border-color: #269278 !important;} .u-tintSpectrum .u-baseColor--borderNormal {border-color: #006F57 !important;} .u-tintSpectrum .u-baseColor--borderDark {border-color: #004732 !important;} .u-tintSpectrum .u-baseColor--iconLight .svgIcon,.u-tintSpectrum .u-baseColor--iconLight.svgIcon {fill: #269278 !important;} .u-tintSpectrum .u-baseColor--iconNormal .svgIcon,.u-tintSpectrum .u-baseColor--iconNormal.svgIcon {fill: #006F57 !important;} .u-tintSpectrum .u-baseColor--iconDark .svgIcon,.u-tintSpectrum .u-baseColor--iconDark.svgIcon {fill: #004732 !important;} .u-tintSpectrum .u-baseColor--textNormal {color: #006F57 !important;} .u-tintSpectrum .u-baseColor--textNormal.u-baseColor--textDarken:hover {color: #002F1C !important;} .u-tintSpectrum .u-baseColor--textDark {color: #002F1C !important;} .u-tintSpectrum .u-baseColor--textDarker {color: #002F1C !important;} .u-tintSpectrum .u-baseColor--backgroundLight {background-color: #269278 !important;} .u-tintSpectrum .u-baseColor--backgroundNormal {background-color: #006F57 !important;} .u-tintSpectrum .u-baseColor--backgroundDark {background-color: #004732 !important;} .u-tintSpectrum .u-baseColor--buttonLight {border-color: #269278 !important; color: #269278 !important;} .u-tintSpectrum .u-baseColor--buttonLight:hover {border-color: #269278 !important;} .u-tintSpectrum .u-baseColor--buttonLight .icon:before,.u-tintSpectrum .u-baseColor--buttonLight .svgIcon {color: #269278 !important; fill: #269278 !important;} .u-tintSpectrum .u-baseColor--buttonDark {border-color: #004732 !important; color: #002F1C !important;} .u-tintSpectrum .u-baseColor--buttonDark:hover {border-color: #002F1C !important;} .u-tintSpectrum .u-baseColor--buttonDark .icon:before,.u-tintSpectrum .u-baseColor--buttonDark .svgIcon {color: #004732 !important; fill: #004732 !important;} .u-tintSpectrum .u-baseColor--buttonNormal {border-color: #006F57 !important; color: #006F57 !important;} .u-tintSpectrum .u-baseColor--buttonNormal:hover {border-color: #004732 !important;} .u-tintSpectrum .u-baseColor--buttonNormal .icon:before,.u-tintSpectrum .u-baseColor--buttonNormal .svgIcon {color: #006F57 !important; fill: #006F57 !important;} .u-tintSpectrum .u-baseColor--buttonDark.button--filled,.u-tintSpectrum .u-baseColor--buttonDark.button--withChrome.is-active {background-color: #004732 !important; border-color: #004732 !important; color: rgba(125, 225, 195, 1) !important; fill: rgba(125, 225, 195, 1) !important;} .u-tintSpectrum .u-baseColor--buttonNormal.button--filled,.u-tintSpectrum .u-baseColor--buttonNormal.button--withChrome.is-active {background-color: #006F57 !important; border-color: #006F57 !important; color: rgba(125, 225, 195, 1) !important; fill: rgba(125, 225, 195, 1) !important;} .u-tintSpectrum .u-baseColor--link {color: #006F57 !important;} .u-tintSpectrum .u-baseColor--link.link--darkenOnHover:hover {color: #002F1C !important;} .u-tintSpectrum .u-baseColor--link.link--darken:hover,.u-tintSpectrum .u-baseColor--link.link--darken:focus,.u-tintSpectrum .u-baseColor--link.link--darken:active {color: #002F1C !important;} .u-tintSpectrum .u-baseColor--link.link--dark {color: #002F1C !important;} .u-tintSpectrum .u-baseColor--link.link--dark.link--darken:hover,.u-tintSpectrum .u-baseColor--link.link--dark.link--darken:focus,.u-tintSpectrum .u-baseColor--link.link--dark.link--darken:active {color: #002F1C !important;} .u-tintSpectrum .u-baseColor--link.link--darker {color: #002F1C !important;} .u-tintSpectrum .u-baseColor--placeholderNormal ::-webkit-input-placeholder {color: #269278;} .u-tintSpectrum .u-baseColor--placeholderNormal ::-moz-placeholder {color: #269278;} .u-tintSpectrum .u-baseColor--placeholderNormal :-ms-input-placeholder {color: #269278;} .u-tintSpectrum .ui-h1,.u-tintSpectrum .ui-h2,.u-tintSpectrum .ui-h3,.u-tintSpectrum .ui-h4,.u-tintSpectrum .ui-brand1,.u-tintSpectrum .ui-brand2,.u-tintSpectrum .ui-captionStrong {color: #002F1C !important; fill: #002F1C !important;} .u-tintSpectrum .ui-body,.u-tintSpectrum .ui-caps {color: #002F1C !important; fill: #002F1C !important;} .u-tintSpectrum .ui-summary,.u-tintSpectrum .ui-caption {color: #269278 !important; fill: #269278 !important;} .u-tintSpectrum .u-accentColor--borderLight {border-color: #269278 !important;} .u-tintSpectrum .u-accentColor--borderNormal {border-color: #006F57 !important;} .u-tintSpectrum .u-accentColor--borderDark {border-color: #004732 !important;} .u-tintSpectrum .u-accentColor--iconLight .svgIcon,.u-tintSpectrum .u-accentColor--iconLight.svgIcon {fill: #269278 !important;} .u-tintSpectrum .u-accentColor--iconNormal .svgIcon,.u-tintSpectrum .u-accentColor--iconNormal.svgIcon {fill: #006F57 !important;} .u-tintSpectrum .u-accentColor--iconDark .svgIcon,.u-tintSpectrum .u-accentColor--iconDark.svgIcon {fill: #004732 !important;} .u-tintSpectrum .u-accentColor--textNormal {color: #006F57 !important;} .u-tintSpectrum .u-accentColor--hoverTextNormal:hover {color: #006F57 !important;} .u-tintSpectrum .u-accentColor--textNormal.u-accentColor--textDarken:hover {color: #002F1C !important;} .u-tintSpectrum .u-accentColor--textDark {color: #002F1C !important;} .u-tintSpectrum .u-accentColor--backgroundLight {background-color: #269278 !important;} .u-tintSpectrum .u-accentColor--backgroundNormal {background-color: #006F57 !important;} .u-tintSpectrum .u-accentColor--backgroundDark {background-color: #004732 !important;} .u-tintSpectrum .u-accentColor--buttonDark {border-color: #004732 !important; color: #002F1C !important;} .u-tintSpectrum .u-accentColor--buttonDark:hover {border-color: #002F1C !important;} .u-tintSpectrum .u-accentColor--buttonDark .icon:before,.u-tintSpectrum .u-accentColor--buttonDark .svgIcon{color: #004732 !important; fill: #004732 !important;} .u-tintSpectrum .u-accentColor--buttonNormal:not(.clapButton--largePill) {border-color: #006F57 !important; color: #006F57 !important;} .u-tintSpectrum .u-accentColor--buttonNormal:hover {border-color: #004732 !important;} .u-tintSpectrum .u-accentColor--buttonNormal .icon:before,.u-tintSpectrum .u-accentColor--buttonNormal .svgIcon{color: #006F57 !important; fill: #006F57 !important;} .u-tintSpectrum .u-accentColor--buttonNormal.button--filled .icon:before,.u-tintSpectrum .u-accentColor--buttonNormal.button--filled .svgIcon{color: rgba(125, 225, 195, 1) !important; fill: rgba(125, 225, 195, 1) !important;} .u-tintSpectrum .u-accentColor--buttonDark.button--filled,.u-tintSpectrum .u-accentColor--buttonDark.button--withChrome.is-active,.u-tintSpectrum .u-accentColor--fillWhenActive.is-active {background-color: #004732 !important; border-color: #004732 !important; color: rgba(125, 225, 195, 1) !important; fill: rgba(125, 225, 195, 1) !important;} .u-tintSpectrum .u-accentColor--buttonNormal.button--filled:not(.clapButton--largePill),.u-tintSpectrum .u-accentColor--buttonNormal.button--withChrome.is-active:not(.clapButton--largePill) {background-color: #006F57 !important; border-color: #006F57 !important; color: rgba(125, 225, 195, 1) !important; fill: rgba(125, 225, 195, 1) !important;} .u-tintSpectrum .postArticle.is-withAccentColors .markup--user,.u-tintSpectrum .postArticle.is-withAccentColors .markup--query {color: #006F57 !important;} .u-accentColor--highlightFaint {background-color: rgba(222, 248, 237, 1) !important;} .u-accentColor--highlightStrong.is-active .svgIcon {fill: rgba(168, 242, 217, 1) !important;} .postArticle.is-withAccentColors .markup--quote.is-other {background-color: rgba(222, 248, 237, 1) !important;} body.is-withMagicUnderlines .postArticle.is-withAccentColors .markup--quote.is-other {background-color: transparent !important; background-image: linear-gradient(to bottom, rgba(222, 248, 237, 1), rgba(222, 248, 237, 1));} .postArticle.is-withAccentColors .markup--quote.is-me {background-color: rgba(194, 244, 226, 1) !important;} body.is-withMagicUnderlines .postArticle.is-withAccentColors .markup--quote.is-me {background-color: transparent !important; background-image: linear-gradient(to bottom, rgba(194, 244, 226, 1), rgba(194, 244, 226, 1));} .postArticle.is-withAccentColors .markup--quote.is-targeted {background-color: rgba(168, 242, 217, 1) !important;} body.is-withMagicUnderlines .postArticle.is-withAccentColors .markup--quote.is-targeted {background-color: transparent !important; background-image: linear-gradient(to bottom, rgba(168, 242, 217, 1), rgba(168, 242, 217, 1));} .postArticle.is-withAccentColors .markup--quote.is-selected {background-color: rgba(168, 242, 217, 1) !important;} body.is-withMagicUnderlines .postArticle.is-withAccentColors .markup--quote.is-selected {background-color: transparent !important; background-image: linear-gradient(to bottom, rgba(168, 242, 217, 1), rgba(168, 242, 217, 1));} .postArticle.is-withAccentColors .markup--highlight {background-color: rgba(168, 242, 217, 1) !important;} body.is-withMagicUnderlines .postArticle.is-withAccentColors .markup--highlight {background-color: transparent !important; background-image: linear-gradient(to bottom, rgba(168, 242, 217, 1), rgba(168, 242, 217, 1));}</style><style class="js-collectionStyleConstant">.u-imageBgColor {background-color: rgba(0, 0, 0, 0.24705882352941178);} .u-imageSpectrum .u-baseColor--borderLight {border-color: rgba(255, 255, 255, 0.6980392156862745) !important;} .u-imageSpectrum .u-baseColor--borderNormal {border-color: rgba(255, 255, 255, 0.8980392156862745) !important;} .u-imageSpectrum .u-baseColor--borderDark {border-color: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-baseColor--iconLight .svgIcon,.u-imageSpectrum .u-baseColor--iconLight.svgIcon {fill: rgba(255, 255, 255, 0.8) !important;} .u-imageSpectrum .u-baseColor--iconNormal .svgIcon,.u-imageSpectrum .u-baseColor--iconNormal.svgIcon {fill: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-baseColor--iconDark .svgIcon,.u-imageSpectrum .u-baseColor--iconDark.svgIcon {fill: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-baseColor--textNormal {color: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-baseColor--textNormal.u-baseColor--textDarken:hover {color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-baseColor--textDark {color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-baseColor--textDarker {color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-baseColor--backgroundLight {background-color: rgba(255, 255, 255, 0.8980392156862745) !important;} .u-imageSpectrum .u-baseColor--backgroundNormal {background-color: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-baseColor--backgroundDark {background-color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-baseColor--buttonLight {border-color: rgba(255, 255, 255, 0.6980392156862745) !important; color: rgba(255, 255, 255, 0.8) !important;} .u-imageSpectrum .u-baseColor--buttonLight:hover {border-color: rgba(255, 255, 255, 0.6980392156862745) !important;} .u-imageSpectrum .u-baseColor--buttonLight .icon:before,.u-imageSpectrum .u-baseColor--buttonLight .svgIcon {color: rgba(255, 255, 255, 0.8) !important; fill: rgba(255, 255, 255, 0.8) !important;} .u-imageSpectrum .u-baseColor--buttonDark {border-color: rgba(255, 255, 255, 0.9490196078431372) !important; color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-baseColor--buttonDark:hover {border-color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-baseColor--buttonDark .icon:before,.u-imageSpectrum .u-baseColor--buttonDark .svgIcon {color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-baseColor--buttonNormal {border-color: rgba(255, 255, 255, 0.8980392156862745) !important; color: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-baseColor--buttonNormal:hover {border-color: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-baseColor--buttonNormal .icon:before,.u-imageSpectrum .u-baseColor--buttonNormal .svgIcon {color: rgba(255, 255, 255, 0.9490196078431372) !important; fill: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-baseColor--buttonDark.button--filled,.u-imageSpectrum .u-baseColor--buttonDark.button--withChrome.is-active {background-color: rgba(255, 255, 255, 1) !important; border-color: rgba(255, 255, 255, 1) !important; color: rgba(0, 0, 0, 0.24705882352941178) !important; fill: rgba(0, 0, 0, 0.24705882352941178) !important;} .u-imageSpectrum .u-baseColor--buttonNormal.button--filled,.u-imageSpectrum .u-baseColor--buttonNormal.button--withChrome.is-active {background-color: rgba(255, 255, 255, 0.9490196078431372) !important; border-color: rgba(255, 255, 255, 0.9490196078431372) !important; color: rgba(0, 0, 0, 0.24705882352941178) !important; fill: rgba(0, 0, 0, 0.24705882352941178) !important;} .u-imageSpectrum .u-baseColor--link {color: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-baseColor--link.link--darkenOnHover:hover {color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-baseColor--link.link--darken:hover,.u-imageSpectrum .u-baseColor--link.link--darken:focus,.u-imageSpectrum .u-baseColor--link.link--darken:active {color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-baseColor--link.link--dark {color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-baseColor--link.link--dark.link--darken:hover,.u-imageSpectrum .u-baseColor--link.link--dark.link--darken:focus,.u-imageSpectrum .u-baseColor--link.link--dark.link--darken:active {color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-baseColor--link.link--darker {color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-baseColor--placeholderNormal ::-webkit-input-placeholder {color: rgba(255, 255, 255, 0.8);} .u-imageSpectrum .u-baseColor--placeholderNormal ::-moz-placeholder {color: rgba(255, 255, 255, 0.8);} .u-imageSpectrum .u-baseColor--placeholderNormal :-ms-input-placeholder {color: rgba(255, 255, 255, 0.8);} .u-imageSpectrum .ui-h1,.u-imageSpectrum .ui-h2,.u-imageSpectrum .ui-h3,.u-imageSpectrum .ui-h4,.u-imageSpectrum .ui-brand1,.u-imageSpectrum .ui-brand2,.u-imageSpectrum .ui-captionStrong {color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .ui-body,.u-imageSpectrum .ui-caps {color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .ui-summary,.u-imageSpectrum .ui-caption {color: rgba(255, 255, 255, 0.8) !important; fill: rgba(255, 255, 255, 0.8) !important;} .u-imageSpectrum .u-accentColor--borderLight {border-color: rgba(255, 255, 255, 0.6980392156862745) !important;} .u-imageSpectrum .u-accentColor--borderNormal {border-color: rgba(255, 255, 255, 0.8980392156862745) !important;} .u-imageSpectrum .u-accentColor--borderDark {border-color: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-accentColor--iconLight .svgIcon,.u-imageSpectrum .u-accentColor--iconLight.svgIcon {fill: rgba(255, 255, 255, 0.8) !important;} .u-imageSpectrum .u-accentColor--iconNormal .svgIcon,.u-imageSpectrum .u-accentColor--iconNormal.svgIcon {fill: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-accentColor--iconDark .svgIcon,.u-imageSpectrum .u-accentColor--iconDark.svgIcon {fill: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-accentColor--textNormal {color: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-accentColor--hoverTextNormal:hover {color: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-accentColor--textNormal.u-accentColor--textDarken:hover {color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-accentColor--textDark {color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-accentColor--backgroundLight {background-color: rgba(255, 255, 255, 0.8980392156862745) !important;} .u-imageSpectrum .u-accentColor--backgroundNormal {background-color: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-accentColor--backgroundDark {background-color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-accentColor--buttonDark {border-color: rgba(255, 255, 255, 0.9490196078431372) !important; color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-accentColor--buttonDark:hover {border-color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-accentColor--buttonDark .icon:before,.u-imageSpectrum .u-accentColor--buttonDark .svgIcon{color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-accentColor--buttonNormal:not(.clapButton--largePill) {border-color: rgba(255, 255, 255, 0.8980392156862745) !important; color: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-accentColor--buttonNormal:hover {border-color: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-accentColor--buttonNormal .icon:before,.u-imageSpectrum .u-accentColor--buttonNormal .svgIcon{color: rgba(255, 255, 255, 0.9490196078431372) !important; fill: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-accentColor--buttonNormal.button--filled .icon:before,.u-imageSpectrum .u-accentColor--buttonNormal.button--filled .svgIcon{color: rgba(0, 0, 0, 0.24705882352941178) !important; fill: rgba(0, 0, 0, 0.24705882352941178) !important;} .u-imageSpectrum .u-accentColor--buttonDark.button--filled,.u-imageSpectrum .u-accentColor--buttonDark.button--withChrome.is-active,.u-imageSpectrum .u-accentColor--fillWhenActive.is-active {background-color: rgba(255, 255, 255, 1) !important; border-color: rgba(255, 255, 255, 1) !important; color: rgba(0, 0, 0, 0.24705882352941178) !important; fill: rgba(0, 0, 0, 0.24705882352941178) !important;} .u-imageSpectrum .u-accentColor--buttonNormal.button--filled:not(.clapButton--largePill),.u-imageSpectrum .u-accentColor--buttonNormal.button--withChrome.is-active:not(.clapButton--largePill) {background-color: rgba(255, 255, 255, 0.9490196078431372) !important; border-color: rgba(255, 255, 255, 0.9490196078431372) !important; color: rgba(0, 0, 0, 0.24705882352941178) !important; fill: rgba(0, 0, 0, 0.24705882352941178) !important;} .u-imageSpectrum .postArticle.is-withAccentColors .markup--user,.u-imageSpectrum .postArticle.is-withAccentColors .markup--query {color: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-accentColor--highlightFaint {background-color: rgba(255, 255, 255, 0.2) !important;} .u-imageSpectrum .u-accentColor--highlightStrong.is-active .svgIcon {fill: rgba(255, 255, 255, 0.6) !important;} .postArticle.is-withAccentColors .u-imageSpectrum .markup--quote.is-other {background-color: rgba(255, 255, 255, 0.2) !important;} body.is-withMagicUnderlines .postArticle.is-withAccentColors .u-imageSpectrum .markup--quote.is-other {background-color: transparent !important; background-image: linear-gradient(to bottom, rgba(255, 255, 255, 0.2), rgba(255, 255, 255, 0.2));} .postArticle.is-withAccentColors .u-imageSpectrum .markup--quote.is-me {background-color: rgba(255, 255, 255, 0.4) !important;} body.is-withMagicUnderlines .postArticle.is-withAccentColors .u-imageSpectrum .markup--quote.is-me {background-color: transparent !important; background-image: linear-gradient(to bottom, rgba(255, 255, 255, 0.4), rgba(255, 255, 255, 0.4));} .postArticle.is-withAccentColors .u-imageSpectrum .markup--quote.is-targeted {background-color: rgba(255, 255, 255, 0.6) !important;} body.is-withMagicUnderlines .postArticle.is-withAccentColors .u-imageSpectrum .markup--quote.is-targeted {background-color: transparent !important; background-image: linear-gradient(to bottom, rgba(255, 255, 255, 0.6), rgba(255, 255, 255, 0.6));} .postArticle.is-withAccentColors .u-imageSpectrum .markup--quote.is-selected {background-color: rgba(255, 255, 255, 0.6) !important;} body.is-withMagicUnderlines .postArticle.is-withAccentColors .u-imageSpectrum .markup--quote.is-selected {background-color: transparent !important; background-image: linear-gradient(to bottom, rgba(255, 255, 255, 0.6), rgba(255, 255, 255, 0.6));} .postArticle.is-withAccentColors .u-imageSpectrum .markup--highlight {background-color: rgba(255, 255, 255, 0.6) !important;} body.is-withMagicUnderlines .postArticle.is-withAccentColors .u-imageSpectrum .markup--highlight {background-color: transparent !important; background-image: linear-gradient(to bottom, rgba(255, 255, 255, 0.6), rgba(255, 255, 255, 0.6));}.u-resetSpectrum .u-tintBgColor {background-color: rgba(255, 255, 255, 1) !important;}.u-resetSpectrum .u-tintBgColor .u-fadeLeft:before {background-image: linear-gradient(to right, rgba(255, 255, 255, 1) 0%, rgba(255, 255, 255, 0) 100%) !important;}.u-resetSpectrum .u-tintBgColor .u-fadeRight:after {background-image: linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 1) 100%) !important;} .u-resetSpectrum .u-baseColor--borderLight {border-color: rgba(0, 0, 0, 0.2980392156862745) !important;} .u-resetSpectrum .u-baseColor--borderNormal {border-color: rgba(0, 0, 0, 0.4980392156862745) !important;} .u-resetSpectrum .u-baseColor--borderDark {border-color: rgba(0, 0, 0, 0.6) !important;} .u-resetSpectrum .u-baseColor--iconLight .svgIcon,.u-resetSpectrum .u-baseColor--iconLight.svgIcon {fill: rgba(0, 0, 0, 0.2980392156862745) !important;} .u-resetSpectrum .u-baseColor--iconNormal .svgIcon,.u-resetSpectrum .u-baseColor--iconNormal.svgIcon {fill: rgba(0, 0, 0, 0.4980392156862745) !important;} .u-resetSpectrum .u-baseColor--iconDark .svgIcon,.u-resetSpectrum .u-baseColor--iconDark.svgIcon {fill: rgba(0, 0, 0, 0.6) !important;} .u-resetSpectrum .u-baseColor--textNormal {color: rgba(0, 0, 0, 0.4980392156862745) !important;} .u-resetSpectrum .u-baseColor--textNormal.u-baseColor--textDarken:hover {color: rgba(0, 0, 0, 0.6) !important;} .u-resetSpectrum .u-baseColor--textDark {color: rgba(0, 0, 0, 0.6) !important;} .u-resetSpectrum .u-baseColor--textDarker {color: rgba(0, 0, 0, 0.8) !important;} .u-resetSpectrum .u-baseColor--backgroundLight {background-color: rgba(0, 0, 0, 0.09803921568627451) !important;} .u-resetSpectrum .u-baseColor--backgroundNormal {background-color: rgba(0, 0, 0, 0.2) !important;} .u-resetSpectrum .u-baseColor--backgroundDark {background-color: rgba(0, 0, 0, 0.2980392156862745) !important;} .u-resetSpectrum .u-baseColor--buttonLight {border-color: rgba(0, 0, 0, 0.2980392156862745) !important; color: rgba(0, 0, 0, 0.2980392156862745) !important;} .u-resetSpectrum .u-baseColor--buttonLight:hover {border-color: rgba(0, 0, 0, 0.2980392156862745) !important;} .u-resetSpectrum .u-baseColor--buttonLight .icon:before,.u-resetSpectrum .u-baseColor--buttonLight .svgIcon {color: rgba(0, 0, 0, 0.2980392156862745) !important; fill: rgba(0, 0, 0, 0.2980392156862745) !important;} .u-resetSpectrum .u-baseColor--buttonDark {border-color: rgba(0, 0, 0, 0.6) !important; color: rgba(0, 0, 0, 0.6) !important;} .u-resetSpectrum .u-baseColor--buttonDark:hover {border-color: rgba(0, 0, 0, 0.8) !important;} .u-resetSpectrum .u-baseColor--buttonDark .icon:before,.u-resetSpectrum .u-baseColor--buttonDark .svgIcon {color: rgba(0, 0, 0, 0.6) !important; fill: rgba(0, 0, 0, 0.6) !important;} .u-resetSpectrum .u-baseColor--buttonNormal {border-color: rgba(0, 0, 0, 0.4980392156862745) !important; color: rgba(0, 0, 0, 0.4980392156862745) !important;} .u-resetSpectrum .u-baseColor--buttonNormal:hover {border-color: rgba(0, 0, 0, 0.6) !important;} .u-resetSpectrum .u-baseColor--buttonNormal .icon:before,.u-resetSpectrum .u-baseColor--buttonNormal .svgIcon {color: rgba(0, 0, 0, 0.4980392156862745) !important; fill: rgba(0, 0, 0, 0.4980392156862745) !important;} .u-resetSpectrum .u-baseColor--buttonDark.button--filled,.u-resetSpectrum .u-baseColor--buttonDark.button--withChrome.is-active {background-color: rgba(0, 0, 0, 0.2980392156862745) !important; border-color: rgba(0, 0, 0, 0.2980392156862745) !important; color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;} .u-resetSpectrum .u-baseColor--buttonNormal.button--filled,.u-resetSpectrum .u-baseColor--buttonNormal.button--withChrome.is-active {background-color: rgba(0, 0, 0, 0.2) !important; border-color: rgba(0, 0, 0, 0.2) !important; color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;} .u-resetSpectrum .u-baseColor--link {color: rgba(0, 0, 0, 0.4980392156862745) !important;} .u-resetSpectrum .u-baseColor--link.link--darkenOnHover:hover {color: rgba(0, 0, 0, 0.6) !important;} .u-resetSpectrum .u-baseColor--link.link--darken:hover,.u-resetSpectrum .u-baseColor--link.link--darken:focus,.u-resetSpectrum .u-baseColor--link.link--darken:active {color: rgba(0, 0, 0, 0.6) !important;} .u-resetSpectrum .u-baseColor--link.link--dark {color: rgba(0, 0, 0, 0.6) !important;} .u-resetSpectrum .u-baseColor--link.link--dark.link--darken:hover,.u-resetSpectrum .u-baseColor--link.link--dark.link--darken:focus,.u-resetSpectrum .u-baseColor--link.link--dark.link--darken:active {color: rgba(0, 0, 0, 0.8) !important;} .u-resetSpectrum .u-baseColor--link.link--darker {color: rgba(0, 0, 0, 0.8) !important;} .u-resetSpectrum .u-baseColor--placeholderNormal ::-webkit-input-placeholder {color: rgba(0, 0, 0, 0.2980392156862745);} .u-resetSpectrum .u-baseColor--placeholderNormal ::-moz-placeholder {color: rgba(0, 0, 0, 0.2980392156862745);} .u-resetSpectrum .u-baseColor--placeholderNormal :-ms-input-placeholder {color: rgba(0, 0, 0, 0.2980392156862745);} .u-resetSpectrum .ui-h1,.u-resetSpectrum .ui-h2,.u-resetSpectrum .ui-h3,.u-resetSpectrum .ui-h4,.u-resetSpectrum .ui-brand1,.u-resetSpectrum .ui-brand2,.u-resetSpectrum .ui-captionStrong {color: rgba(0, 0, 0, 0.8) !important; fill: rgba(0, 0, 0, 0.8) !important;} .u-resetSpectrum .ui-body,.u-resetSpectrum .ui-caps {color: rgba(0, 0, 0, 0.6) !important; fill: rgba(0, 0, 0, 0.6) !important;} .u-resetSpectrum .ui-summary,.u-resetSpectrum .ui-caption {color: rgba(0, 0, 0, 0.2980392156862745) !important; fill: rgba(0, 0, 0, 0.2980392156862745) !important;} .u-resetSpectrum .u-accentColor--borderLight {border-color: rgba(26, 137, 23, 1) !important;} .u-resetSpectrum .u-accentColor--borderNormal {border-color: rgba(26, 137, 23, 1) !important;} .u-resetSpectrum .u-accentColor--borderDark {border-color: rgba(17, 128, 14, 1) !important;} .u-resetSpectrum .u-accentColor--iconLight .svgIcon,.u-resetSpectrum .u-accentColor--iconLight.svgIcon {fill: rgba(26, 137, 23, 1) !important;} .u-resetSpectrum .u-accentColor--iconNormal .svgIcon,.u-resetSpectrum .u-accentColor--iconNormal.svgIcon {fill: rgba(17, 128, 14, 1) !important;} .u-resetSpectrum .u-accentColor--iconDark .svgIcon,.u-resetSpectrum .u-accentColor--iconDark.svgIcon {fill: rgba(15, 115, 12, 1) !important;} .u-resetSpectrum .u-accentColor--textNormal {color: rgba(17, 128, 14, 1) !important;} .u-resetSpectrum .u-accentColor--hoverTextNormal:hover {color: rgba(17, 128, 14, 1) !important;} .u-resetSpectrum .u-accentColor--textNormal.u-accentColor--textDarken:hover {color: rgba(15, 115, 12, 1) !important;} .u-resetSpectrum .u-accentColor--textDark {color: rgba(15, 115, 12, 1) !important;} .u-resetSpectrum .u-accentColor--backgroundLight {background-color: rgba(26, 137, 23, 1) !important;} .u-resetSpectrum .u-accentColor--backgroundNormal {background-color: rgba(17, 128, 14, 1) !important;} .u-resetSpectrum .u-accentColor--backgroundDark {background-color: rgba(15, 115, 12, 1) !important;} .u-resetSpectrum .u-accentColor--buttonDark {border-color: rgba(17, 128, 14, 1) !important; color: rgba(15, 115, 12, 1) !important;} .u-resetSpectrum .u-accentColor--buttonDark:hover {border-color: rgba(15, 115, 12, 1) !important;} .u-resetSpectrum .u-accentColor--buttonDark .icon:before,.u-resetSpectrum .u-accentColor--buttonDark .svgIcon{color: rgba(15, 115, 12, 1) !important; fill: rgba(15, 115, 12, 1) !important;} .u-resetSpectrum .u-accentColor--buttonNormal:not(.clapButton--largePill) {border-color: rgba(26, 137, 23, 1) !important; color: rgba(17, 128, 14, 1) !important;} .u-resetSpectrum .u-accentColor--buttonNormal:hover {border-color: rgba(17, 128, 14, 1) !important;} .u-resetSpectrum .u-accentColor--buttonNormal .icon:before,.u-resetSpectrum .u-accentColor--buttonNormal .svgIcon{color: rgba(17, 128, 14, 1) !important; fill: rgba(17, 128, 14, 1) !important;} .u-resetSpectrum .u-accentColor--buttonNormal.button--filled .icon:before,.u-resetSpectrum .u-accentColor--buttonNormal.button--filled .svgIcon{color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;} .u-resetSpectrum .u-accentColor--buttonDark.button--filled,.u-resetSpectrum .u-accentColor--buttonDark.button--withChrome.is-active,.u-resetSpectrum .u-accentColor--fillWhenActive.is-active {background-color: rgba(15, 115, 12, 1) !important; border-color: rgba(15, 115, 12, 1) !important; color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;} .u-resetSpectrum .u-accentColor--buttonNormal.button--filled:not(.clapButton--largePill),.u-resetSpectrum .u-accentColor--buttonNormal.button--withChrome.is-active:not(.clapButton--largePill) {background-color: rgba(17, 128, 14, 1) !important; border-color: rgba(17, 128, 14, 1) !important; color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;} .u-resetSpectrum .postArticle.is-withAccentColors .markup--user,.u-resetSpectrum .postArticle.is-withAccentColors .markup--query {color: rgba(17, 128, 14, 1) !important;}</style><div class="js-collectionFooter u-tintBgColor u-hide"><div class="container u-maxWidth1040"><div class="u-marginTop10 u-paddingTop10 u-paddingBottom30 u-tintSpectrum"><div class="linkSet u-clearfix"><div class="u-floatRight u-textColorNormal u-baseColor--textNormal u-xs-floatLeft"><a class="button button--chromeless u-baseColor--buttonNormal u-marginLeft15 u-lineHeight35 u-xs-block u-xs-marginLeft0" href="https://proandroiddev.com/about" title="About ProAndroidDev" aria-label="About ProAndroidDev" data-collection-slug="proandroiddev">About ProAndroidDev</a><span class="middotDivider u-xs-hide"></span><a class="button button--chromeless u-baseColor--buttonNormal u-lineHeight35 u-xs-block" href="https://proandroiddev.com/latest" title="Latest Stories for ProAndroidDev" aria-label="Latest Stories for ProAndroidDev" data-collection-slug="proandroiddev">Latest Stories</a><span class="middotDivider u-xs-hide"></span><a class="button button--chromeless u-baseColor--buttonNormal u-lineHeight35 u-xs-block" href="https://proandroiddev.com/archive" title="Archive for ProAndroidDev" aria-label="Archive for ProAndroidDev" data-collection-slug="proandroiddev">Archive</a><span class="middotDivider u-xs-hide"></span><a class="button button--chromeless u-baseColor--buttonNormal u-lineHeight35 u-xs-block" href="https://medium.com/about">About Medium</a><span class="middotDivider u-xs-hide"></span><a class="button button--chromeless u-baseColor--buttonNormal u-lineHeight35 u-xs-block" href="https://policy.medium.com/medium-terms-of-service-9db0094a1e0f">Terms</a><span class="middotDivider u-xs-hide"></span><a class="button button--chromeless u-baseColor--buttonNormal u-lineHeight35 u-xs-block" href="https://policy.medium.com/medium-privacy-policy-f03bf92035c9">Privacy</a><span class="middotDivider u-xs-hide"></span><a class="button button--chromeless u-baseColor--buttonNormal u-lineHeight35 u-xs-block" href="https://medium.com/business">Teams</a></div></div></div></div></div></div></div></div><div class="loadingBar"></div><script>// <![CDATA[ window["obvInit"] = function (opt_embedded) {window["obvInit"]["embedded"] = opt_embedded; window["obvInit"]["ready"] = true;} // ]]></script><script>// <![CDATA[ var GLOBALS = {"audioUrl":"https://d1fcbxp97j4nb2.cloudfront.net","baseUrl":"https://proandroiddev.com","buildLabel":"20241126-1740-root","currentUser":{"userId":"lo_983366ffdf48","isVerified":false,"subscriberEmail":"","hasPastMemberships":false,"isEnrolledInHightower":false,"isEligibleForHightower":true,"hightowerLastLockedAt":0,"isWriterProgramEnrolled":true,"isWriterProgramInvited":false,"isWriterProgramOptedOut":false,"writerProgramVersion":0,"writerProgramEnrolledAt":0,"friendLinkOnboarding":0,"hasAdditionalUnlocks":false,"hasApiAccess":false,"writerProgramDistributionSettingOptedIn":false,"isSuspended":false,"collectionOnboardingSeen":0,"atsQualifiedAt":0},"currentUserHasUnverifiedEmail":false,"isAuthenticated":false,"isCurrentUserVerified":false,"miroUrl":"https://cdn-images-1.medium.com","moduleUrls":{"base":"https://cdn-static-1.medium.com/_/fp/gen-js/main-base.bundle.95z8xpkUEidhPbIWsh2BVw.12.js","common-async":"https://cdn-static-1.medium.com/_/fp/gen-js/main-common-async.bundle.zqOu8dxaQRtqDyChHdOWlQ.12.js","hightower":"https://cdn-static-1.medium.com/_/fp/gen-js/main-hightower.bundle.y0UkxCxPBUbLlduk5XbwLQ.12.js","home-screens":"https://cdn-static-1.medium.com/_/fp/gen-js/main-home-screens.bundle.eZhPgaD8AglnbC5Rzxqvhg.12.js","misc-screens":"https://cdn-static-1.medium.com/_/fp/gen-js/main-misc-screens.bundle.XeRjm4FlHTBOsUvoOQ6Ppg.12.js","notes":"https://cdn-static-1.medium.com/_/fp/gen-js/main-notes.bundle.r9MSvtAmj0CMkyIC0CCCbA.12.js","payments":"https://cdn-static-1.medium.com/_/fp/gen-js/main-payments.bundle.AiXyuYj3AvxRA1-7HEyP9Q.12.js","posters":"https://cdn-static-1.medium.com/_/fp/gen-js/main-posters.bundle.fsLyLvZO4VZXL_zb4RXgeg.12.js","power-readers":"https://cdn-static-1.medium.com/_/fp/gen-js/main-power-readers.bundle.6Dyc-nVN2MDV_AM9XDAZug.12.js","pubs":"https://cdn-static-1.medium.com/_/fp/gen-js/main-pubs.bundle.rUyrVjlTpUj61voxnZosQw.12.js","stats":"https://cdn-static-1.medium.com/_/fp/gen-js/main-stats.bundle.2I2tXSo7-rbez_WYXfga0Q.12.js"},"previewConfig":{"weightThreshold":1,"weightImageParagraph":0.51,"weightIframeParagraph":0.8,"weightTextParagraph":0.08,"weightEmptyParagraph":0,"weightP":0.003,"weightH":0.005,"weightBq":0.003,"minPTextLength":60,"truncateBoundaryChars":20,"detectTitle":true,"detectTitleLevThreshold":0.15},"productName":"Medium","supportsEdit":false,"termsUrl":"//policy.medium.com/medium-terms-of-service-9db0094a1e0f","textshotHost":"textshot.textshot-production.svc.cluster.local","transactionId":"1732718852553:d6d98a3a59f7","useragent":{"browser":"ie","family":"ie","os":"windows","version":7,"supportsDesktopEdit":false,"supportsInteract":false,"supportsView":true,"isMobile":false,"isTablet":false,"isNative":false,"supportsFileAPI":false,"isTier1":false,"clientVersion":"","clientChannel":"","supportsRealScrollEvents":false,"supportsVhUnits":false,"ruinsViewportSections":false,"supportsHtml5Video":false,"supportsMagicUnderlines":false,"isWebView":false,"isFacebookWebView":false,"supportsProgressiveMedia":false,"supportsPromotedPosts":true,"isBot":false,"isNativeIphone":false,"supportsCssVariables":false,"supportsVideoSections":true,"emojiSupportLevel":1,"isSearchBot":false,"isSyndicationBot":false,"isNativeAndroid":false,"isNativeIos":false,"isSeoAuditBot":false,"isInternalApp":false,"supportsApplePay":false,"supportsScrollableMetabar":false},"variants":{"allow_access":true,"allow_signup":true,"allow_test_auth":"disallow","android_enable_editor_new_publishing_flow":true,"android_enable_friend_links_creation":true,"android_enable_friend_links_postpage_banners":true,"android_enable_image_sharer":true,"android_enable_lists_v2":true,"android_enable_syntax_highlight":true,"android_enable_topic_portals":true,"android_rating_prompt_stories_read_threshold":2,"android_two_hour_refresh":true,"available_annual_plan":"2c754bcc2995","available_annual_premium_plan":"4a442ace1476","available_monthly_plan":"60e220181034","available_monthly_premium_plan":"12a660186432","browsable_stream_config_bucket":"curated-topics","can_receive_tips_v0":true,"can_send_tips_v0":true,"coronavirus_topic_recirc":true,"disable_partner_program_enrollment":true,"enable_abandoned_cart_promotion_email":true,"enable_android_dynamic_aspirational_paywall":true,"enable_android_dynamic_programming_paywall":true,"enable_android_miro_v2":true,"enable_android_offline_reading":true,"enable_android_verified_author":true,"enable_app_flirty_thirty":true,"enable_apple_sign_in":true,"enable_apple_webhook":true,"enable_aurora_pub_follower_page":true,"enable_author_cards":true,"enable_author_cards_byline":true,"enable_auto_follow_on_subscribe":true,"enable_automod":true,"enable_bayesian_average_pub_search":true,"enable_bg_post_post":true,"enable_billing_frequency_on_step2":"group_1","enable_boost_nia_v01":true,"enable_braintree_apple_pay":true,"enable_braintree_client":true,"enable_braintree_google_pay":true,"enable_braintree_integration":true,"enable_braintree_paypal":true,"enable_braintree_trial_membership":true,"enable_braintree_webhook":true,"enable_branch_io":true,"enable_cache_less_following_feed":true,"enable_configure_pronouns":true,"enable_conversion_model_v2":"group_2","enable_conversion_ranker_v2":"control","enable_creator_welcome_email":true,"enable_deprecate_legacy_providers_v3":true,"enable_diversification_rex":true,"enable_entities_to_follow_v2":true,"enable_eventstats_event_processing":true,"enable_explicit_signals":true,"enable_explicit_signals_updated_post_previews":true,"enable_footer_app_buttons":true,"enable_google_one_tap":true,"enable_google_webhook":true,"enable_group_gifting":true,"enable_iceland_forced_android":true,"enable_import":true,"enable_intrinsic_automatic_actions":true,"enable_ios_autorefresh":true,"enable_ios_dynamic_paywall_aspiriational":true,"enable_ios_dynamic_paywall_programming":true,"enable_ios_easy_resubscribe":true,"enable_ios_offline_reading":true,"enable_legacy_feed_in_iceland":true,"enable_lite_archive_page":true,"enable_lite_continue_this_thread":true,"enable_lite_homepage":true,"enable_lite_response_markup":true,"enable_lite_server_upstream_deadlines":true,"enable_lo_homepage":"control","enable_maim_the_meter":true,"enable_marketing_emails":true,"enable_mastodon_avatar_upload":true,"enable_mastodon_for_members":true,"enable_mastodon_for_members_username_selection":true,"enable_medium2_kbfd":true,"enable_members_only_audio":true,"enable_ml_rank_rex_anno":true,"enable_moc_load_processor_all_recs_surfaces":true,"enable_moc_load_processor_c":true,"enable_moc_load_processor_first_story":true,"enable_new_manage_membership_flow":true,"enable_new_stripe_customers":true,"enable_newsletter_lo_flow_custom_domains":true,"enable_pill_based_home_feed":true,"enable_post_bottom_responses":true,"enable_post_bottom_responses_input":true,"enable_pp_country_expansion":true,"enable_pp_v4":true,"enable_pre_pp_v4":true,"enable_premium_tier":true,"enable_premium_tier_badge":true,"enable_publication_hierarchy_web":true,"enable_ranker_v10":"control","enable_recaptcha_enterprise":true,"enable_recirc_model":true,"enable_recommended_publishers_query":true,"enable_rex_aggregator_v2":true,"enable_rex_new_push_notification_endpoint":true,"enable_rex_reading_history":true,"enable_rito_upstream_deadlines":true,"enable_seamless_social_sharing":true,"enable_see_pronouns":true,"enable_sharer_create_post_share_key":true,"enable_sharer_validate_post_share_key":true,"enable_simplified_digest_v2_b":true,"enable_speechify_ios":true,"enable_speechify_widget":true,"enable_sprig":true,"enable_starspace":true,"enable_susi_redesign_android":true,"enable_susi_redesign_ios":true,"enable_switch_plan_premium_tier":true,"enable_tag_recs":true,"enable_tick_landing_page":true,"enable_tipping_v0_android":true,"enable_tipping_v0_ios":true,"enable_tribute_landing_page":true,"enable_update_explore_wtf":true,"enable_update_topic_portals_wtf":true,"enable_updated_pub_recs_ui":true,"enable_verifications_service":true,"glyph_font_set":"m2-unbound-source-serif-pro","goliath_externalsearch_enable_comment_deindexation":true,"ios_display_paywall_after_onboarding":true,"ios_enable_friend_links_creation":true,"ios_enable_friend_links_postpage_banners":true,"ios_enable_home_post_menu":true,"ios_enable_lock_responses":true,"ios_enable_verified_book_author":true,"ios_iceland_nux":true,"ios_in_app_free_trial":true,"ios_remove_twitter_onboarding_step":true,"ios_social_share_sheet":true,"limit_post_referrers":true,"limit_user_follows":true,"mobile_custom_app_icon":true,"num_post_bottom_responses_to_show":"1","onboarding_tags_from_top_views":true,"reader_fair_distribution_non_qp":true,"redefined_top_posts":true,"reengagement_notification_duration":3,"rex_generator_max_candidates":1000,"signin_services":"twitter,facebook,google,email,google-fastidv,google-one-tap,apple","signup_services":"twitter,facebook,google,email,google-fastidv,google-one-tap,apple","skip_fs_cache_user_vals":true},"xsrfToken":"","iosAppId":"828256236","supportEmail":"yourfriends@medium.com","fp":{"/icons/monogram-mask.svg":"https://cdn-static-1.medium.com/_/fp/icons/monogram-mask.KPLCSFEZviQN0jQ7veN2RQ.12.svg","/icons/favicon-medium-editor.ico":"https://cdn-static-1.medium.com/_/fp/icons/favicon-medium-editor.PiakrZWB7Yb80quUVQWM6g.12.ico"},"authBaseUrl":"https://medium.com","imageUploadSizeMb":25,"isAuthDomainRequest":false,"domainCollectionSlug":"proandroiddev","algoliaApiEndpoint":"https://MQ57UUUQZ2-dsn.algolia.net","algoliaAppId":"MQ57UUUQZ2","algoliaSearchOnlyApiKey":"394474ced050e3911ae2249ecc774921","iosAppStoreUrl":"https://itunes.apple.com/app/medium-everyones-stories/id828256236?pt=698524&mt=8","iosAppLinkBaseUrl":"medium:","algoliaIndexPrefix":"medium_","androidPlayStoreUrl":"https://play.google.com/store/apps/details?id=com.medium.reader","googleClientId":"216296035834-k1k6qe060s2tp2a2jam4ljdcms00sttg.apps.googleusercontent.com","androidPackage":"com.medium.reader","androidPlayStoreMarketScheme":"market://details?id=com.medium.reader","googleAuthUri":"https://accounts.google.com/o/oauth2/auth","androidScheme":"medium","layoutData":{"useDynamicScripts":false,"googleAnalyticsTrackingCode":"G-7JY7T788PK","jsShivUrl":"https://cdn-static-1.medium.com/_/fp/js/shiv.RI2ePTZ5gFmMgLzG5bEVAA.12.js","useDynamicCss":false,"faviconUrl":"https://miro.medium.com/v2/5d8de952517e8160e40ef9841c781cdc14a5db313057fa3c3de41c6f5b494b19","faviconImageId":"5d8de952517e8160e40ef9841c781cdc14a5db313057fa3c3de41c6f5b494b19","fontSets":[{"id":8,"url":"https://glyph.medium.com/css/e/sr/latin/e/ssr/latin/e/ssb/latin/m2-unbound-source-serif-pro.css"},{"id":11,"url":"https://glyph.medium.com/css/m2-unbound-source-serif-pro.css"},{"id":9,"url":"https://glyph.medium.com/css/mkt.css"}],"glyphUrl":"https://glyph.medium.com"},"authBaseUrlRev":"moc.muidem//:sptth","stripePublishableKey":"pk_live_7FReX44VnNIInZwrIIx6ghjl","archiveUploadSizeMb":100,"previewConfig2":{"weightThreshold":1,"weightImageParagraph":0.05,"raiseImage":true,"enforceHeaderHierarchy":true,"isImageInsetRight":true},"isAmp":false,"iosScheme":"medium","facebook":{"key":"542599432471018","namespace":"medium-com","scope":{"default":["public_profile","email"],"connect":["public_profile","email"],"login":["public_profile","email"],"share":["public_profile","email"]}},"memberContentTopicId":"13d7efd82fb2","audioContentTopicId":"3792abbd134","isDoNotAuth":false,"buggle":{"videoUrl":"https://cdn-videos-1.medium.com","audioUrl":"https://cdn-audio-1.medium.com"},"referrerType":5,"partnerProgramEmail":"partnerprogram@medium.com","recaptchaKey":"6Lfc37IUAAAAAKGGtC6rLS13R1Hrw_BqADfS1LRk","countryCode":"SG","bypassMeter":false,"branchKey":"key_live_ofxXr2qTrrU9NqURK8ZwEhknBxiI6KBm","paypal":{"clientMode":"production","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/redeem.","price":"50.00","currency":"USD","sku":"membership-gift-1-yr"}},"collectionConfig":{"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"]},"bypassMeterWithShareKey":false,"recaptcha3Key":"6Lf8R9wUAAAAABMI_85Wb8melS7Zj6ziuf99Yot5","braintreeClientKey":"production_zjkj96jm_m56f8fqpf7ngnrd4","cdcMessaging":[{"text":"For more information on the novel coronavirus and Covid-19, visit ","href":"","type":"text","start":0,"end":0},{"text":"cdc.gov","href":"https://www.cdc.gov/coronavirus/2019-nCoV","type":"link","start":66,"end":73},{"text":".","href":"","type":"text","start":0,"end":0}],"braintree":{"merchantId":"m56f8fqpf7ngnrd4"},"diagnostics":{},"domain":"medium.com"} // ]]></script><script charset="UTF-8" src="https://cdn-static-1.medium.com/_/fp/gen-js/main-base.bundle.95z8xpkUEidhPbIWsh2BVw.12.js" async></script><script>// <![CDATA[ window["obvInit"]({"references":{"Collection":{"c72404660798":{"id":"c72404660798","name":"ProAndroidDev","slug":"proandroiddev","tags":[],"creatorId":"c6e8e225f7d5","description":"The latest posts from Android Professionals and Google Developer Experts.","shortDescription":"The latest posts from Android Professionals and Google…","image":{"imageId":"1*XVtdl45m8YaYrPI4buJ5yQ.png","filter":"","backgroundSize":"","originalWidth":1000,"originalHeight":1000,"strategy":"resample","height":0,"width":0},"metadata":{"followerCount":62208,"activeAt":1732674772273},"virtuals":{"permissions":{"canPublish":false,"canPublishAll":false,"canRepublish":false,"canRemove":false,"canManageAll":false,"canSubmit":false,"canEditPosts":false,"canAddWriters":false,"canViewStats":false,"canSendNewsletter":false,"canViewLockedPosts":false,"canViewCloaked":false,"canEditOwnPosts":false,"canBeAssignedAuthor":false,"canEnrollInHightower":false,"canLockPostsForMediumMembers":false,"canLockOwnPostsForMediumMembers":false,"canViewNewsletterV2Stats":false,"canCreateNewsletterV3":false},"isSubscribed":false,"isEnrolledInHightower":false,"isEligibleForHightower":false,"isSubscribedToCollectionEmails":false,"isMuted":false,"canToggleEmail":false,"isWriter":false},"logo":{"imageId":"","filter":"","backgroundSize":"","originalWidth":0,"originalHeight":0,"strategy":"resample","height":0,"width":0},"twitterUsername":"proandroiddev","facebookPageName":"proandroiddev","publicEmail":"editors@proandroiddev.com","domain":"proandroiddev.com","sections":[{"type":2,"collectionHeaderMetadata":{"backgroundImage":{"id":"1*i5UmD6poC0MpEw0UlnWhTQ.png","originalWidth":2000,"originalHeight":250},"logoImage":{"id":"1*V45--ieyNysokCIUqFXTKw@2x.png","originalWidth":1,"originalHeight":2,"alt":"ProAndroidDev"},"alignment":2,"layout":5}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":9,"postIds":[],"sectionHeader":"Trending Blogs"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"38769d69f98a"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[],"sectionHeader":"Latest"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[],"sectionHeader":"Latest"}}],"tintColor":"#FF7DE1C3","lightText":false,"favicon":{"imageId":"1*A8VytPZQhvUf_MG6hm_Dlw.png","filter":"","backgroundSize":"","originalWidth":128,"originalHeight":128,"strategy":"resample","height":0,"width":0},"colorPalette":{"defaultBackgroundSpectrum":{"colorPoints":[{"color":"#FF2E987E","point":0},{"color":"#FF318D75","point":0.1},{"color":"#FF32826C","point":0.2},{"color":"#FF327663","point":0.3},{"color":"#FF306B5A","point":0.4},{"color":"#FF2E5F50","point":0.5},{"color":"#FF2A5347","point":0.6},{"color":"#FF26463C","point":0.7},{"color":"#FF203931","point":0.8},{"color":"#FF192C25","point":0.9},{"color":"#FF101D19","point":1}],"backgroundColor":"#FFFFFFFF"},"tintBackgroundSpectrum":{"colorPoints":[{"color":"#FF7DE1C3","point":0},{"color":"#FF6ED2B5","point":0.1},{"color":"#FF5EC3A6","point":0.2},{"color":"#FF4EB397","point":0.3},{"color":"#FF3CA388","point":0.4},{"color":"#FF269278","point":0.5},{"color":"#FF008168","point":0.6},{"color":"#FF006F57","point":0.7},{"color":"#FF005C45","point":0.8},{"color":"#FF004732","point":0.9},{"color":"#FF002F1C","point":1}],"backgroundColor":"#FF7DE1C3"},"highlightSpectrum":{"colorPoints":[{"color":"#FFE4F8EF","point":0},{"color":"#FFDEF8ED","point":0.1},{"color":"#FFD9F7EB","point":0.2},{"color":"#FFD3F6E9","point":0.3},{"color":"#FFCEF6E7","point":0.4},{"color":"#FFC8F5E4","point":0.5},{"color":"#FFC2F4E2","point":0.6},{"color":"#FFBCF4E0","point":0.7},{"color":"#FFB5F3DE","point":0.8},{"color":"#FFAFF2DB","point":0.9},{"color":"#FFA8F2D9","point":1}],"backgroundColor":"#FFFFFFFF"},"darkBackgroundSpectrum":{"colorPoints":[{"color":"#FF4CB196","point":0},{"color":"#FF60B99F","point":0.1},{"color":"#FF72C0A7","point":0.2},{"color":"#FF82C7B0","point":0.3},{"color":"#FF91CDB9","point":0.4},{"color":"#FFA0D4C2","point":0.5},{"color":"#FFAEDACA","point":0.6},{"color":"#FFBCE1D3","point":0.7},{"color":"#FFC9E7DB","point":0.8},{"color":"#FFD6EDE3","point":0.9},{"color":"#FFE3F3EC","point":1}],"backgroundColor":"#FF000000"}},"navItems":[{"type":2,"title":"Submit","postId":"b2efa7f46272","url":"https://proandroiddev.com/submission-guidelines-b2efa7f46272","source":"postId"},{"type":5,"title":"Archive","url":"https://proandroiddev.com/archive"},{"type":6,"title":"About","url":"https://proandroiddev.com/about"},{"type":3,"title":"droidcon Academy","url":"https://academy.droidcon.com"}],"colorBehavior":2,"collectionFeatures":[30],"ampLogo":{"imageId":"","filter":"","backgroundSize":"","originalWidth":0,"originalHeight":0,"strategy":"resample","height":0,"width":0},"header":{"backgroundImage":{"id":"1*i5UmD6poC0MpEw0UlnWhTQ.png","originalWidth":2000,"originalHeight":250},"logoImage":{"id":"1*V45--ieyNysokCIUqFXTKw@2x.png","originalWidth":1,"originalHeight":2,"alt":"ProAndroidDev"},"alignment":2,"layout":5},"paidForDomainAt":1497851443187,"subscriberCount":62208,"tagline":"The latest posts from Android Professionals and Google Developer Experts","isOptedIntoAurora":false,"newsletterV3":{"newsletterV3Id":"278dceec521d","type":1,"name":"ProAndroidDev Digest","description":"Get updates on latest posts on ProAndroidDev and never miss a hot story! ","collectionId":"c72404660798","newsletterSlug":"proandroiddev-digest","isSubscribed":false,"showPromo":false,"avatarImageId":"","creatorId":"6c67343165e2","showNewsletterPostsInCollectionHome":false,"exportableSubscribersCount":2035,"subscribersCount":12158,"promoHeadline":"","promoBody":"","replyToEmail":""},"isCurationAllowedByDefault":false,"polarisCoverImage":{"imageId":"","filter":"","backgroundSize":"","originalWidth":0,"originalHeight":0,"strategy":"resample","height":0,"width":0},"ptsQualifiedAt":1616092782276,"type":"Collection"}},"User":{"9ad99ca649d4":{"userId":"9ad99ca649d4","name":"Arnaud Giuliani","username":"giuliani-arnaud","createdAt":1448863503940,"imageId":"1*aRvmkmivw-VRIX-6wYUVCA.jpeg","backgroundImageId":"","bio":"Lead of #Koin framework (insert-koin.io) - Co-founder of Kotzilla (kotzilla.io) - Google Dev Expert #Kotlin - #AndroidDev","allowNotes":1,"mediumMemberAt":1716797025000,"isWriterProgramEnrolled":true,"isSuspended":false,"isMembershipTrialEligible":true,"optInToIceland":true,"subdomainCreatedAt":1614088771393,"hasCompletedProfile":false,"userDismissableFlags":[32,29,21,18,48,12,41,8,50,30,2,1,33],"hasSeenIcelandOnboarding":true,"postSubscribeMembershipUpsellShownAt":0,"languageCode":"fr-fr","type":"User"},"709acf7c07e3":{"userId":"709acf7c07e3","name":"Sandeep Kella","username":"sandeepkella23","createdAt":1700073622118,"imageId":"1*m4ij-Lr2ZViGgYmypjtQ9A.png","backgroundImageId":"","bio":"Android dev by day, tech writer by night. Breaking down code so even my cat could understand it. Join me on Medium for fun, geeky, and practical Android tips!","twitterScreenName":"","allowNotes":1,"mediumMemberAt":1720924617425,"isWriterProgramEnrolled":true,"isSuspended":false,"firstOpenedAndroidApp":1700148986943,"isMembershipTrialEligible":true,"facebookDisplayName":"","optInToIceland":true,"hasCompletedProfile":false,"isCreatorPartnerProgramEnrolled":true,"userDismissableFlags":[47,29,44,41,50,37,36,19,49],"hasSeenIcelandOnboarding":true,"postSubscribeMembershipUpsellShownAt":0,"languageCode":"en-gb","type":"User"},"d70ea3470e6a":{"userId":"d70ea3470e6a","name":"Siva Ganesh Kantamani","username":"sgkantamani","createdAt":1494304458171,"imageId":"1*bVSRBKr1Pb75KQuhsPXO7g.png","backgroundImageId":"","bio":"Android | Compose | Kotlin Multiplatform. Visit me https://about.me/sivaganesh_kantamani & Join my email list at https://sgkantamani.substack.com/p/subscribe","twitterScreenName":"SG5202","allowNotes":1,"mediumMemberAt":1724472688122,"isWriterProgramEnrolled":true,"isSuspended":false,"isMembershipTrialEligible":false,"facebookDisplayName":"","optInToIceland":true,"userFlags":[1],"subdomainCreatedAt":1609394242168,"hasCompletedProfile":false,"isCreatorPartnerProgramEnrolled":true,"userDismissableFlags":[32,29,21,19,49,48,47,12,11,9,8,50,5,4,3,2,1,33],"hasSeenIcelandOnboarding":true,"postSubscribeMembershipUpsellShownAt":0,"languageCode":"en-us","type":"User"},"61b66809c334":{"userId":"61b66809c334","name":"Stefano Natali","username":"stefanoq21","createdAt":1511861313660,"imageId":"1*nJT9nmRwE28kmJAEiRyHMw.png","backgroundImageId":"","bio":"Senior Android Developer, Kotlin and Compose enthusiast. https://github.com/stefanoq21","twitterScreenName":"","allowNotes":1,"mediumMemberAt":0,"isWriterProgramEnrolled":true,"isSuspended":false,"isMembershipTrialEligible":true,"facebookDisplayName":"","optInToIceland":true,"hasCompletedProfile":false,"userDismissableFlags":[47,6,29,36,19,41],"hasSeenIcelandOnboarding":true,"postSubscribeMembershipUpsellShownAt":0,"languageCode":"it-it","type":"User"},"e072cea221fc":{"userId":"e072cea221fc","name":"Siddharth Gupta","username":"siddh.gupta99","createdAt":1543252064654,"imageId":"1*6rI29yuZZDr-3XD0qlJ-RQ.jpeg","backgroundImageId":"","bio":"Mobile Developer building CRED","twitterScreenName":"","allowNotes":1,"mediumMemberAt":0,"isWriterProgramEnrolled":true,"isSuspended":false,"isMembershipTrialEligible":true,"facebookDisplayName":"","optInToIceland":true,"hasCompletedProfile":false,"userDismissableFlags":[29],"hasSeenIcelandOnboarding":false,"postSubscribeMembershipUpsellShownAt":0,"languageCode":"en-us","type":"User"},"6d77f07dc67":{"userId":"6d77f07dc67","name":"Katie Barnett","username":"katiebarnett5","createdAt":1517880923764,"imageId":"1*5UmMOU3BxA7gSCobglh6zw.png","backgroundImageId":"","bio":"Android GDE | Android Evangelist @ Bilue | katiebarnett.dev","twitterScreenName":"","allowNotes":1,"mediumMemberAt":1707967430000,"isWriterProgramEnrolled":true,"isSuspended":false,"firstOpenedAndroidApp":1704723645348,"isMembershipTrialEligible":true,"facebookDisplayName":"","optInToIceland":true,"hasCompletedProfile":false,"userDismissableFlags":[32,29,12,41,8,50,21,30,19,2,18,33],"hasSeenIcelandOnboarding":true,"postSubscribeMembershipUpsellShownAt":0,"languageCode":"en-au","type":"User"},"4369a38c1d4f":{"userId":"4369a38c1d4f","name":"Tanya Arora","username":"tanyandroid","createdAt":1518433567762,"imageId":"1*yEkfsQNgR3VHbOT2VzHrIg.jpeg","backgroundImageId":"","bio":"","twitterScreenName":"","allowNotes":1,"mediumMemberAt":0,"isWriterProgramEnrolled":true,"isSuspended":false,"isMembershipTrialEligible":true,"facebookDisplayName":"","optInToIceland":true,"subdomainCreatedAt":1623356135398,"hasCompletedProfile":true,"userDismissableFlags":[29,18,49,48,47,12,8,6,50,5,3,2,1,33],"hasSeenIcelandOnboarding":true,"postSubscribeMembershipUpsellShownAt":0,"languageCode":"en-gb","type":"User"},"cb954442a18e":{"userId":"cb954442a18e","name":"Dobri Kostadinov","username":"dobri.kostadinov","createdAt":1563952269256,"imageId":"1*PDWUz7RmoqP9kmFnZzGPUg.jpeg","backgroundImageId":"","bio":"15+ years in native Android dev (Java, Kotlin). Expert in developing beautiful android native apps.","twitterScreenName":"","allowNotes":1,"mediumMemberAt":1569999600000,"isWriterProgramEnrolled":true,"isSuspended":false,"isMembershipTrialEligible":true,"facebookDisplayName":"","optInToIceland":true,"hasCompletedProfile":false,"isCreatorPartnerProgramEnrolled":true,"userDismissableFlags":[32,48,47,29,12,8,50,21,19,2,33,49],"hasSeenIcelandOnboarding":true,"postSubscribeMembershipUpsellShownAt":0,"languageCode":"en-us","type":"User"},"9bb203a4ab2e":{"userId":"9bb203a4ab2e","name":"Jaewoong Eum","username":"skydoves","createdAt":1511833595690,"imageId":"1*to22-X47VSP4tZeElwVKKA.png","backgroundImageId":"","bio":"Senior Android Developer Advocate @ Stream 🥑 • GDE for Android • OSS engineer. Love psychology, magic tricks, and writing poems. https://github.com/skydoves","twitterScreenName":"github_skydoves","allowNotes":1,"mediumMemberAt":1592552045000,"isWriterProgramEnrolled":true,"isSuspended":false,"isMembershipTrialEligible":true,"facebookDisplayName":"","optInToIceland":true,"subdomainCreatedAt":1605695102528,"hasCompletedProfile":false,"isCreatorPartnerProgramEnrolled":true,"userDismissableFlags":[32,29,21,19,18,48,12,44,8,50,5,4,3,2,1,33],"hasSeenIcelandOnboarding":true,"postSubscribeMembershipUpsellShownAt":0,"languageCode":"en-us","type":"User"},"b48b9b0e3d4d":{"userId":"b48b9b0e3d4d","name":"Sagar Malhotra","username":"sagar0-0","createdAt":1663085628019,"imageId":"1*PCJVPFHPX_oQ4eILPEDSag.jpeg","backgroundImageId":"","bio":"Android dev by day, Creator by night.🥷🏻 Sharing my passion through videos, blogs and conferences.🚀","twitterScreenName":"sagar0_o","allowNotes":1,"mediumMemberAt":0,"isWriterProgramEnrolled":true,"isSuspended":false,"firstOpenedAndroidApp":1663472770606,"isMembershipTrialEligible":true,"facebookDisplayName":"","optInToIceland":true,"subdomainCreatedAt":1675230034753,"hasCompletedProfile":false,"userDismissableFlags":[32,29,44,41,8,6,30,19,2,33],"hasSeenIcelandOnboarding":true,"postSubscribeMembershipUpsellShownAt":0,"languageCode":"en-us","type":"User"},"4ced6b06c2b7":{"userId":"4ced6b06c2b7","name":"Reza","username":"mrnajafi","createdAt":1441781197874,"imageId":"1*T95Zeqgg_vm1yNzTq7I3Jg.png","backgroundImageId":"","bio":"Android Engineer with 14+ years of experience. https://bit.ly/flydroidz","allowNotes":1,"mediumMemberAt":1724039790512,"isWriterProgramEnrolled":true,"isSuspended":false,"firstOpenedIosApp":1602738779516,"isMembershipTrialEligible":true,"optInToIceland":true,"subdomainCreatedAt":1702350442630,"hasCompletedProfile":false,"userDismissableFlags":[29,12,8,50,5,21,36,3,2,1,33,49],"hasSeenIcelandOnboarding":true,"postSubscribeMembershipUpsellShownAt":0,"languageCode":"sv-se","type":"User"},"727137e47bff":{"userId":"727137e47bff","name":"Omar Sahl","username":"omarsahl","createdAt":1517616099193,"imageId":"1*TB_nVStV_doFD3tJYIwjsA@2x.jpeg","backgroundImageId":"","bio":"","twitterScreenName":"","allowNotes":1,"mediumMemberAt":1729600861000,"isWriterProgramEnrolled":true,"isSuspended":false,"firstOpenedIosApp":1591701766837,"isMembershipTrialEligible":false,"facebookDisplayName":"","optInToIceland":true,"hasCompletedProfile":true,"userDismissableFlags":[8,47,5,29,12],"hasSeenIcelandOnboarding":true,"postSubscribeMembershipUpsellShownAt":0,"languageCode":"en","type":"User"},"b69ba9cd4ff2":{"userId":"b69ba9cd4ff2","name":"Anitaa Murthy","username":"anitaa_1990","createdAt":1453058669965,"imageId":"1*062ZoiVn_WJIT9PYUS4yww.jpeg","backgroundImageId":"","bio":"Android Developer https://github.com/anitaa1990 https://devanddroid.com/","twitterScreenName":"MurthyAnitaa","allowNotes":1,"mediumMemberAt":0,"isWriterProgramEnrolled":true,"isSuspended":false,"isMembershipTrialEligible":true,"facebookDisplayName":"","optInToIceland":true,"hasCompletedProfile":false,"userDismissableFlags":[19,47,29],"hasSeenIcelandOnboarding":true,"postSubscribeMembershipUpsellShownAt":0,"languageCode":"en-us","type":"User"},"55eb0bd9ca57":{"userId":"55eb0bd9ca57","name":"Andrii Veremiienko","username":"andriyveremiyenko","createdAt":1694435243926,"imageId":"1*_zSSttSTG1UslDuGUKvNvg.jpeg","backgroundImageId":"","bio":"","twitterScreenName":"","allowNotes":1,"mediumMemberAt":1694435316000,"isWriterProgramEnrolled":true,"isSuspended":false,"firstOpenedAndroidApp":1694435355958,"isMembershipTrialEligible":true,"facebookDisplayName":"","optInToIceland":true,"hasCompletedProfile":true,"userDismissableFlags":[50,29,49],"hasSeenIcelandOnboarding":true,"postSubscribeMembershipUpsellShownAt":0,"languageCode":"en-us","type":"User"},"bc628276716f":{"userId":"bc628276716f","name":"Sergei Mikhailovskii","username":"mikhailovskii.sergei","createdAt":1561458583999,"imageId":"0*pQI7CRTSrlmr4iRF.jpg","backgroundImageId":"","bio":"Mobile developer @IDF Technology. Android and KMM lover, iOS enthusiast.","twitterScreenName":"","allowNotes":1,"mediumMemberAt":0,"isWriterProgramEnrolled":true,"isSuspended":false,"isMembershipTrialEligible":true,"facebookDisplayName":"","optInToIceland":true,"hasCompletedProfile":false,"userDismissableFlags":[32,29,21,19,47,12,41,8,7,5,30,36,2,10,33],"hasSeenIcelandOnboarding":false,"postSubscribeMembershipUpsellShownAt":0,"languageCode":"en-gb","type":"User"}},"Post":{"ff7bb40470df":{"id":"ff7bb40470df","versionId":"21a1765c98c8","creatorId":"9ad99ca649d4","homeCollectionId":"c72404660798","title":"Benchmarking Koin vs. Dagger Hilt in Modern Android Development (2024)","detectedLanguage":"en","latestVersion":"21a1765c98c8","latestPublishedVersion":"21a1765c98c8","hasUnpublishedEdits":false,"latestRev":1573,"createdAt":1732102890157,"updatedAt":1732713011702,"acceptedAt":0,"firstPublishedAt":1732672821762,"latestPublishedAt":1732713011702,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"How Koin scales and performs compared to Hilt, using practical benchmarks and insights.","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"1*h5ULv-tGdDA3yD2c685lFQ.png","filter":"","backgroundSize":"","originalWidth":1400,"originalHeight":682,"strategy":"resample","height":0,"width":0},"wordCount":1256,"imageCount":8,"readingTime":5.8729559748427675,"subtitle":"How Koin scales and performs compared to Hilt, using practical benchmarks and insights.","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":22,"isBookmarked":false,"tags":[{"slug":"koin","name":"Koin","postCount":565,"metadata":{"postCount":565,"coverImage":{"id":"1*8kMaRJPi-HkK7N_ccEyAGw.png","originalWidth":470,"originalHeight":266,"isFeatured":true}},"type":"Tag"},{"slug":"dependency-injection","name":"Dependency Injection","postCount":4704,"metadata":{"postCount":4704,"coverImage":{"id":"1*mIJNJgvn_eidAp_xR2U-MQ.jpeg","originalWidth":800,"originalHeight":550,"isFeatured":true}},"type":"Tag"},{"slug":"android","name":"Android","postCount":143707,"metadata":{"postCount":143707,"coverImage":{"id":"1*bPrF2ZemLaRrMYCmvLmWMQ.png","originalWidth":2560,"originalHeight":1280,"isFeatured":true}},"type":"Tag"},{"slug":"performance","name":"Performance","postCount":29126,"metadata":{"postCount":29126,"coverImage":{"id":"1*KNsJIR3pEoni-r-QimaAjQ.jpeg","originalWidth":976,"originalHeight":549}},"type":"Tag"},{"slug":"benchmark","name":"Benchmark","postCount":2184,"metadata":{"postCount":2184,"coverImage":{"id":"1*h5ULv-tGdDA3yD2c685lFQ.png","originalWidth":1400,"originalHeight":682,"isFeatured":true}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":3,"links":{"entries":[{"url":"https://insert-koin.io/docs/reference/koin-android/start#start-koin-with-androidx-startup-401","alts":[],"httpStatus":200},{"url":"https://insert-koin.io/","alts":[],"httpStatus":200},{"url":"https://insert-koin.io/docs/setup/why/#koin-a-dependency-injection-framework","alts":[],"httpStatus":200},{"url":"https://gist.github.com/arnaudgiuliani/9e05451d111373eaf570c7f3a4465ad2","alts":[],"httpStatus":200},{"url":"https://kotzilla.io/","alts":[],"httpStatus":200},{"url":"https://developer.android.com/topic/performance/baselineprofiles/measure-baselineprofile","alts":[],"httpStatus":200},{"url":"https://github.com/InsertKoinIO/nowinandroid/blob/perfs_koin/app/src/main/kotlin/com/google/samples/apps/nowinandroid/MainActivity.kt#L77","alts":[],"httpStatus":200},{"url":"https://slack-chats.kotlinlang.org/c/koin","alts":[],"httpStatus":200},{"url":"https://github.com/InsertKoinIO/nowinandroid/blob/perfs_koin/core/data/src/main/kotlin/com/google/samples/apps/nowinandroid/core/data/Measure.kt","alts":[],"httpStatus":200},{"url":"https://github.com/InsertKoinIO/nowinandroid/blob/perfs_hilt/app/src/main/kotlin/com/google/samples/apps/nowinandroid/MainActivity.kt#L80","alts":[],"httpStatus":200},{"url":"https://github.com/InsertKoinIO/nowinandroid/tree/perfs_hilt","alts":[],"httpStatus":200},{"url":"https://github.com/android/nowinandroid","alts":[],"httpStatus":200},{"url":"https://github.com/InsertKoinIO/nowinandroid/blob/perfs_koin/feature/foryou/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/foryou/ForYouScreen.kt#L113","alts":[],"httpStatus":200},{"url":"https://github.com/InsertKoinIO/nowinandroid/tree/perfs_koin","alts":[],"httpStatus":200},{"url":"https://github.com/InsertKoinIO/nowinandroid","alts":[],"httpStatus":200},{"url":"https://github.com/InsertKoinIO/nowinandroid/blob/perfs_hilt/feature/foryou/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/foryou/ForYouScreen.kt#L113","alts":[],"httpStatus":200},{"url":"https://bit.ly/benchmark_koin_hilt_2024","alts":[],"httpStatus":200}],"version":"0.3","generatedAt":1732713012963},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":108,"sectionCount":3,"readingList":0,"topics":[{"topicId":"64756708407c","slug":"android-development","createdAt":1521652914155,"deletedAt":0,"image":{"id":"1*zLD64ewnrZ3XKBtDUMXQ-w@2x.jpeg","originalWidth":3000,"originalHeight":1997},"name":"Android Dev","description":"Building little green robots.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Android Development: Articles and News — Medium","type":"Topic"},{"topicId":"decb52b64abf","slug":"programming","createdAt":1493934116328,"deletedAt":0,"image":{"id":"1*iPa136b1cGEO7lvoXg6uHQ@2x.jpeg","originalWidth":6016,"originalHeight":4016},"name":"Programming","description":"The good, the bad, the buggy.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Programming News and Articles — Medium","type":"Topic"}]},"coverless":true,"slug":"benchmarking-koin-vs-dagger-hilt-in-modern-android-development-2024","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":false,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"benchmarking-koin-vs-dagger-hilt-in-modern-android-development-2024-ff7bb40470df","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"1*h5ULv-tGdDA3yD2c685lFQ.png","originalWidth":1400,"originalHeight":682,"isFeatured":true}},{"name":"2533","type":3,"text":"Benchmarking Koin vs. Dagger Hilt in Modern Android Development (2024)","markups":[],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"How Koin scales and performs compared to Hilt, using practical benchmarks and insights."},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"c72404660798","isNewsletter":false,"newsletterId":"5dc0e5d2eef7","webCanonicalUrl":"","mediumUrl":"","migrationId":"","notifyFollowers":true,"notifyTwitter":false,"notifyFacebook":false,"responseHiddenOnParentPostAt":0,"isSeries":false,"isSubscriptionLocked":false,"seriesLastAppendedAt":0,"audioVersionDurationSec":0,"sequenceId":"","isEligibleForRevenue":false,"isBlockedFromHightower":false,"deletedAt":0,"lockedPostSource":0,"hightowerMinimumGuaranteeStartsAt":0,"hightowerMinimumGuaranteeEndsAt":0,"featureLockRequestAcceptedAt":0,"mongerRequestType":1,"layerCake":0,"socialTitle":"","socialDek":"","editorialPreviewTitle":"","editorialPreviewDek":"","curationEligibleAt":0,"isProxyPost":false,"proxyPostFaviconUrl":"","proxyPostProviderName":"","proxyPostType":0,"isSuspended":false,"isLimitedState":false,"seoTitle":"","previewContent2":{"bodyModel":{"paragraphs":[{"name":"2533","type":3,"text":"Benchmarking Koin vs. Dagger Hilt in Modern Android Development (2024)","markups":[]},{"name":"6302","type":1,"text":"When choosing a dependency injection framework for Android and Kotlin development, performance is often a key consideration. This article explores the performance of Koin in its latest version (4.0.1-Beta1) and compares it with Dagger Hilt (2.52). Rather than relying on simplistic benchmarks or limited code execution scenarios, the focus is…","markups":[{"type":1,"start":166,"end":170},{"type":1,"start":194,"end":205},{"type":1,"start":228,"end":246},{"type":1,"start":499,"end":503}]}],"sections":[{"name":"890e","startIndex":0}]},"isFullContent":false,"subtitle":"How Koin scales and performs compared to Hilt, using practical benchmarks and insights."},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":true,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"},"517909777921":{"id":"517909777921","versionId":"097ce6f49e5b","creatorId":"709acf7c07e3","homeCollectionId":"c72404660798","title":"A Practical Guide to Android Interface Definition Language (AIDL) with a Real-Time Example","detectedLanguage":"en","latestVersion":"097ce6f49e5b","latestPublishedVersion":"097ce6f49e5b","hasUnpublishedEdits":false,"latestRev":186,"createdAt":1732641409331,"updatedAt":1732675486665,"acceptedAt":0,"firstPublishedAt":1732641528411,"latestPublishedAt":1732674772211,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"Android Interface Definition Language (AIDL) is a powerful tool for enabling interprocess communication (IPC) in Android applications…","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"1*bqXiu9b178PqdrckQOM31Q.png","filter":"","backgroundSize":"","originalWidth":1024,"originalHeight":1024,"strategy":"resample","height":0,"width":0},"wordCount":746,"imageCount":1,"readingTime":3.0150943396226415,"subtitle":"Android Interface Definition Language (AIDL) is a powerful tool for enabling interprocess communication (IPC) in Android applications…","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":2,"isBookmarked":false,"tags":[{"slug":"andorid","name":"Andorid","postCount":281,"metadata":{"postCount":281,"coverImage":{"id":"1*bqXiu9b178PqdrckQOM31Q.png","originalWidth":1024,"originalHeight":1024}},"type":"Tag"},{"slug":"andorid-aidl","name":"Andorid Aidl","postCount":0,"metadata":{"postCount":0,"coverImage":{"id":"1*bqXiu9b178PqdrckQOM31Q.png","originalWidth":1024,"originalHeight":1024}},"type":"Tag"},{"slug":"aidl","name":"Aidl","postCount":28,"metadata":{"postCount":28,"coverImage":{"id":"1*bqXiu9b178PqdrckQOM31Q.png","originalWidth":1024,"originalHeight":1024}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":0,"links":{"entries":[],"version":"0.3","generatedAt":1732674772325},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":2,"sectionCount":11,"readingList":0,"topics":[{"topicId":"64756708407c","slug":"android-development","createdAt":1521652914155,"deletedAt":0,"image":{"id":"1*zLD64ewnrZ3XKBtDUMXQ-w@2x.jpeg","originalWidth":3000,"originalHeight":1997},"name":"Android Dev","description":"Building little green robots.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Android Development: Articles and News — Medium","type":"Topic"}]},"coverless":true,"slug":"a-practical-guide-to-android-interface-definition-language-aidl-with-a-real-time-example","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":true,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"a-practical-guide-to-android-interface-definition-language-aidl-with-a-real-time-example-517909777921","previewContent":{"bodyModel":{"paragraphs":[{"name":"d42a","type":4,"text":"","markups":[],"layout":9,"metadata":{"id":"1*bqXiu9b178PqdrckQOM31Q.png","originalWidth":1024,"originalHeight":1024}},{"name":"8574","type":3,"text":"A Practical Guide to Android Interface Definition Language (AIDL) with a Real-Time Example","markups":[],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"Android Interface Definition Language (AIDL) is a powerful tool for enabling interprocess communication (IPC) in Android applications…"},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"c72404660798","isNewsletter":false,"newsletterId":"857e8ed720a5","webCanonicalUrl":"","mediumUrl":"","migrationId":"","notifyFollowers":true,"notifyTwitter":false,"notifyFacebook":false,"responseHiddenOnParentPostAt":0,"isSeries":false,"isSubscriptionLocked":false,"seriesLastAppendedAt":0,"audioVersionDurationSec":0,"sequenceId":"","isEligibleForRevenue":false,"isBlockedFromHightower":false,"deletedAt":0,"lockedPostSource":0,"hightowerMinimumGuaranteeStartsAt":0,"hightowerMinimumGuaranteeEndsAt":0,"featureLockRequestAcceptedAt":0,"mongerRequestType":1,"layerCake":0,"socialTitle":"","socialDek":"","editorialPreviewTitle":"","editorialPreviewDek":"","curationEligibleAt":0,"isProxyPost":false,"proxyPostFaviconUrl":"","proxyPostProviderName":"","proxyPostType":0,"isSuspended":false,"isLimitedState":false,"seoTitle":"","previewContent2":{"bodyModel":{"paragraphs":[{"name":"d42a","type":4,"text":"","markups":[],"layout":1,"metadata":{"id":"1*bqXiu9b178PqdrckQOM31Q.png","originalWidth":1024,"originalHeight":1024}},{"name":"8574","type":3,"text":"A Practical Guide to Android Interface Definition Language (AIDL) with a Real-Time Example","markups":[]},{"name":"8757","type":1,"text":"Android Interface Definition Language (AIDL) is a powerful tool for enabling interprocess communication (IPC) in Android applications. While theoretical explanations are helpful, understanding AIDL becomes much easier when explored through a real-world use case. In this article, we’ll dive into AIDL by creating a simple Currency Conversion Service that processes…","markups":[{"type":1,"start":322,"end":349}]}],"sections":[{"name":"27ce","startIndex":0}]},"isFullContent":false,"subtitle":"Android Interface Definition Language (AIDL) is a powerful tool for enabling interprocess communication (IPC) in Android applications…"},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":true,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"},"38c8cd5dc16c":{"id":"38c8cd5dc16c","versionId":"605e4cd92c02","creatorId":"d70ea3470e6a","homeCollectionId":"c72404660798","title":"Migration Guide from Retrofit and KAPT to Ktor and KSP","detectedLanguage":"en","latestVersion":"605e4cd92c02","latestPublishedVersion":"605e4cd92c02","hasUnpublishedEdits":false,"latestRev":941,"createdAt":1725194715379,"updatedAt":1732589938138,"acceptedAt":0,"firstPublishedAt":1732523604031,"latestPublishedAt":1732523604031,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"Network Client and Annotation Processor migration to support Kotlin Multiplatform","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"0*K_Blg9wuGY60ti9k","filter":"","backgroundSize":"","originalWidth":4000,"originalHeight":4000,"strategy":"resample","height":0,"width":0},"wordCount":1018,"imageCount":4,"readingTime":4.541509433962264,"subtitle":"Network Client and Annotation Processor migration to support Kotlin Multiplatform","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":3,"isBookmarked":false,"tags":[{"slug":"kotlin-multiplatform","name":"Kotlin Multiplatform","postCount":1398,"metadata":{"postCount":1398,"coverImage":{"id":"1*8kMaRJPi-HkK7N_ccEyAGw.png","originalWidth":470,"originalHeight":266,"isFeatured":true}},"type":"Tag"},{"slug":"retrofit","name":"Retrofit","postCount":1040,"metadata":{"postCount":1040,"coverImage":{"id":"1*px8AxzHVLxeWcCPAxR_t5w.png","originalWidth":1600,"originalHeight":766}},"type":"Tag"},{"slug":"ktor","name":"Ktor","postCount":427,"metadata":{"postCount":427,"coverImage":{"id":"1*TJ-njv3J_8r4HDBmWNJXVA.jpeg","originalWidth":1500,"originalHeight":750,"isFeatured":true}},"type":"Tag"},{"slug":"ksp","name":"Ksp","postCount":98,"metadata":{"postCount":98,"coverImage":{"id":"0*K_Blg9wuGY60ti9k","originalWidth":4000,"originalHeight":4000,"isFeatured":true,"unsplashPhotoId":"CrPAvN29Nhs"}},"type":"Tag"},{"slug":"kapt","name":"Kapt","postCount":60,"metadata":{"postCount":60,"coverImage":{"id":"0*K_Blg9wuGY60ti9k","originalWidth":4000,"originalHeight":4000,"isFeatured":true,"unsplashPhotoId":"CrPAvN29Nhs"}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":0,"links":{"entries":[{"url":"https://unsplash.com?utm_source=medium&utm_medium=referral","alts":[],"httpStatus":200},{"url":"https://twitter.com/SG5202","alts":[],"httpStatus":200},{"url":"https://unsplash.com/@v4ssu?utm_source=medium&utm_medium=referral","alts":[],"httpStatus":200},{"url":"https://www.quora.com/profile/Siva-Ganesh-Kantamani-1","alts":[],"httpStatus":200},{"url":"https://www.linkedin.com/in/siva-kantamani-bb59309b/","alts":[],"httpStatus":999},{"url":"https://kotlinlang.org/docs/ksp-overview.html#resources","alts":[],"httpStatus":200},{"url":"https://kotlinlang.org/docs/ksp-quickstart.html#pass-options-to-processors","alts":[],"httpStatus":200},{"url":"https://betterprogramming.pub/how-to-use-ktor-in-your-android-app-a99f50cc9444","alts":[{"type":3,"url":"medium://p/a99f50cc9444"},{"type":2,"url":"medium://p/a99f50cc9444"}],"httpStatus":200},{"url":"https://sgkantamani.medium.com/migration-guide-from-hilt-to-koin-ea8083d3f7a9","alts":[{"type":3,"url":"medium://p/ea8083d3f7a9"},{"type":2,"url":"medium://p/ea8083d3f7a9"}],"httpStatus":200},{"url":"https://betterprogramming.pub/ktor-in-server-side-development-the-basics-81ce4bbba878","alts":[{"type":3,"url":"medium://p/81ce4bbba878"},{"type":2,"url":"medium://p/81ce4bbba878"}],"httpStatus":200},{"url":"https://medium.com/@sgkantamani","alts":[{"type":2,"url":"medium://@sgkantamani"},{"type":3,"url":"medium://@sgkantamani"}],"httpStatus":200}],"version":"0.3","generatedAt":1732523605927},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":6,"sectionCount":5,"readingList":0,"topics":[{"topicId":"64756708407c","slug":"android-development","createdAt":1521652914155,"deletedAt":0,"image":{"id":"1*zLD64ewnrZ3XKBtDUMXQ-w@2x.jpeg","originalWidth":3000,"originalHeight":1997},"name":"Android Dev","description":"Building little green robots.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Android Development: Articles and News — Medium","type":"Topic"},{"topicId":"decb52b64abf","slug":"programming","createdAt":1493934116328,"deletedAt":0,"image":{"id":"1*iPa136b1cGEO7lvoXg6uHQ@2x.jpeg","originalWidth":6016,"originalHeight":4016},"name":"Programming","description":"The good, the bad, the buggy.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Programming News and Articles — Medium","type":"Topic"}]},"coverless":true,"slug":"migration-guide-from-retrofit-and-kapt-to-ktor-and-ksp","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":true,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"migration-guide-from-retrofit-and-kapt-to-ktor-and-ksp-38c8cd5dc16c","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"0*K_Blg9wuGY60ti9k","originalWidth":4000,"originalHeight":4000,"isFeatured":true,"unsplashPhotoId":"CrPAvN29Nhs"}},{"name":"previewTitle","type":3,"text":"Migration Guide from Retrofit and KAPT to Ktor and KSP","alignment":1},{"name":"previewSubtitle","type":13,"text":"Network Client and Annotation Processor…","alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"Network Client and Annotation Processor migration to support Kotlin Multiplatform"},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"c72404660798","isNewsletter":false,"newsletterId":"f6d0d3cb252f","webCanonicalUrl":"","mediumUrl":"","migrationId":"","notifyFollowers":true,"notifyTwitter":false,"notifyFacebook":false,"responseHiddenOnParentPostAt":0,"isSeries":false,"isSubscriptionLocked":false,"seriesLastAppendedAt":0,"audioVersionDurationSec":0,"sequenceId":"","isEligibleForRevenue":false,"isBlockedFromHightower":false,"deletedAt":0,"lockedPostSource":0,"hightowerMinimumGuaranteeStartsAt":0,"hightowerMinimumGuaranteeEndsAt":0,"featureLockRequestAcceptedAt":0,"mongerRequestType":1,"layerCake":6,"socialTitle":"","socialDek":"","editorialPreviewTitle":"","editorialPreviewDek":"","curationEligibleAt":0,"isProxyPost":false,"proxyPostFaviconUrl":"","proxyPostProviderName":"","proxyPostType":0,"isSuspended":false,"isLimitedState":false,"seoTitle":"","previewContent2":{"bodyModel":{"paragraphs":[{"name":"1e00","type":13,"text":"Incremental Migration from Android to KMP Project — Part 2","markups":[]},{"name":"81d9","type":3,"text":"Migration Guide from Retrofit and KAPT to Ktor and KSP","markups":[]},{"name":"d942","type":13,"text":"Network Client and Annotation Processor migration to support Kotlin Multiplatform","markups":[]},{"name":"8e4c","type":4,"text":"Photo by Hardik Sharma on Unsplash","markups":[{"type":3,"start":9,"end":22,"href":"https://unsplash.com/@v4ssu?utm_source=medium&utm_medium=referral","title":"","rel":"photo-creator","anchorType":0},{"type":3,"start":26,"end":34,"href":"https://unsplash.com?utm_source=medium&utm_medium=referral","title":"","rel":"photo-source","anchorType":0}],"layout":1,"metadata":{"id":"0*K_Blg9wuGY60ti9k","originalWidth":4000,"originalHeight":4000,"isFeatured":true,"unsplashPhotoId":"CrPAvN29Nhs"}},{"name":"06ff","type":13,"text":"Takeaway from this article","markups":[]},{"name":"57a4","type":1,"text":"In this article, you’ll learn why we might need to migrate from Retrofit to Ktor and KAPT to KSP. By the end of this article, you will be able to remove Retrofit and KAPT from the project safely.","markups":[]},{"name":"9ffa","type":3,"text":"Introduction","markups":[]},{"name":"1de3","type":1,"text":"This is part 2 in the series of migrations from the Android…","markups":[{"type":3,"start":108,"end":114,"href":"https://sgkantamani.medium.com/migration-guide-from-hilt-to-koin-ea8083d3f7a9","title":"","rel":"","anchorType":0}]}],"sections":[{"name":"1f36","startIndex":0},{"name":"3b60","startIndex":6}]},"isFullContent":false,"subtitle":"Network Client and Annotation Processor migration to support Kotlin Multiplatform"},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":true,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"},"2565bb90fef8":{"id":"2565bb90fef8","versionId":"b8cbfb3fe486","creatorId":"61b66809c334","homeCollectionId":"c72404660798","title":"Elevating Your Jetpack Compose UI with GraphicsLayer","detectedLanguage":"en","latestVersion":"b8cbfb3fe486","latestPublishedVersion":"b8cbfb3fe486","hasUnpublishedEdits":false,"latestRev":371,"createdAt":1732441805006,"updatedAt":1732523249649,"acceptedAt":0,"firstPublishedAt":1732470837004,"latestPublishedAt":1732523249547,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"Explore the Power of Layer-based transformations and effects","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"1*XeP3JED3Ubhmccah7E6hYg.jpeg","filter":"","backgroundSize":"","originalWidth":1376,"originalHeight":768,"strategy":"resample","height":0,"width":0},"wordCount":982,"imageCount":3,"readingTime":4.255660377358491,"subtitle":"Explore the Power of Layer-based transformations and effects","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":17,"isBookmarked":false,"tags":[{"slug":"jetpack-compose","name":"Jetpack Compose","postCount":6081,"metadata":{"postCount":6081,"coverImage":{"id":"1*bPrF2ZemLaRrMYCmvLmWMQ.png","originalWidth":2560,"originalHeight":1280,"isFeatured":true}},"type":"Tag"},{"slug":"android","name":"Android","postCount":143707,"metadata":{"postCount":143707,"coverImage":{"id":"1*bPrF2ZemLaRrMYCmvLmWMQ.png","originalWidth":2560,"originalHeight":1280,"isFeatured":true}},"type":"Tag"},{"slug":"android-app-development","name":"Android App Development","postCount":48196,"metadata":{"postCount":48196,"coverImage":{"id":"1*XeP3JED3Ubhmccah7E6hYg.jpeg","originalWidth":1376,"originalHeight":768,"isFeatured":true}},"type":"Tag"},{"slug":"kotlin","name":"Kotlin","postCount":30983,"metadata":{"postCount":30983,"coverImage":{"id":"1*XeP3JED3Ubhmccah7E6hYg.jpeg","originalWidth":1376,"originalHeight":768,"isFeatured":true}},"type":"Tag"},{"slug":"androiddev","name":"AndroidDev","postCount":12148,"metadata":{"postCount":12148,"coverImage":{"id":"1*XeP3JED3Ubhmccah7E6hYg.jpeg","originalWidth":1376,"originalHeight":768,"isFeatured":true}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":0,"links":{"entries":[{"url":"https://bsky.app/profile/stefanoq21.bsky.social","alts":[],"httpStatus":200},{"url":"https://github.com/stefanoq21/ComposePlayground","alts":[],"httpStatus":200},{"url":"https://github.com/stefanoq21/ComposePlayground/blob/main/app/src/main/java/com/stefanoq21/composeplayground/ui/screen/graphicsLayer/GraphicsLayerScreen.kt","alts":[],"httpStatus":200},{"url":"https://www.youtube.com/watch?v=KawI7srRvOM","alts":[],"httpStatus":200},{"url":"http://www.linkedin.com/in/stefano-natali-q21","alts":[{"type":3,"url":"https://it.linkedin.com/in/stefano-natali-q21"},{"type":2,"url":"https://it.linkedin.com/in/stefano-natali-q21"}],"httpStatus":200}],"version":"0.3","generatedAt":1732523252120},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":43,"sectionCount":1,"readingList":0,"topics":[{"topicId":"64756708407c","slug":"android-development","createdAt":1521652914155,"deletedAt":0,"image":{"id":"1*zLD64ewnrZ3XKBtDUMXQ-w@2x.jpeg","originalWidth":3000,"originalHeight":1997},"name":"Android Dev","description":"Building little green robots.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Android Development: Articles and News — Medium","type":"Topic"},{"topicId":"decb52b64abf","slug":"programming","createdAt":1493934116328,"deletedAt":0,"image":{"id":"1*iPa136b1cGEO7lvoXg6uHQ@2x.jpeg","originalWidth":6016,"originalHeight":4016},"name":"Programming","description":"The good, the bad, the buggy.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Programming News and Articles — Medium","type":"Topic"}]},"coverless":true,"slug":"elevating-your-jetpack-compose-ui-with-graphicslayer","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":false,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"elevating-your-jetpack-compose-ui-with-graphicslayer-2565bb90fef8","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"1*XeP3JED3Ubhmccah7E6hYg.jpeg","originalWidth":1376,"originalHeight":768,"isFeatured":true}},{"name":"bccf","type":3,"text":"Elevating Your Jetpack Compose UI with GraphicsLayer","markups":[],"alignment":1},{"name":"773e","type":13,"text":"Explore the Power of Layer-based transformations…","markups":[],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"Explore the Power of Layer-based transformations and effects"},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"c72404660798","isNewsletter":false,"newsletterId":"6435545774a1","webCanonicalUrl":"","mediumUrl":"","migrationId":"","notifyFollowers":true,"notifyTwitter":false,"notifyFacebook":false,"responseHiddenOnParentPostAt":0,"isSeries":false,"isSubscriptionLocked":false,"seriesLastAppendedAt":0,"audioVersionDurationSec":0,"sequenceId":"","isEligibleForRevenue":false,"isBlockedFromHightower":false,"deletedAt":0,"lockedPostSource":0,"hightowerMinimumGuaranteeStartsAt":0,"hightowerMinimumGuaranteeEndsAt":0,"featureLockRequestAcceptedAt":0,"mongerRequestType":1,"layerCake":6,"socialTitle":"","socialDek":"","editorialPreviewTitle":"","editorialPreviewDek":"","curationEligibleAt":0,"isProxyPost":false,"proxyPostFaviconUrl":"","proxyPostProviderName":"","proxyPostType":0,"isSuspended":false,"isLimitedState":false,"seoTitle":"","previewContent2":{"bodyModel":{"paragraphs":[{"name":"bccf","type":3,"text":"Elevating Your Jetpack Compose UI with GraphicsLayer","markups":[]},{"name":"773e","type":13,"text":"Explore the Power of Layer-based transformations and effects","markups":[]},{"name":"a635","type":4,"text":"","markups":[],"layout":1,"metadata":{"id":"1*XeP3JED3Ubhmccah7E6hYg.jpeg","originalWidth":1376,"originalHeight":768,"isFeatured":true}},{"name":"218c","type":1,"text":"In Jetpack Compose, creating stunning and interactive UIs depends on using the right tools effectively. One of these tools is the GraphicsLayer modifier. In this article, we’ll uncover the full potential of GraphicsLayer and demonstrate how it can be used to craft unique, dynamic user experiences.","markups":[{"type":1,"start":3,"end":18},{"type":1,"start":130,"end":152}]},{"name":"4f12","type":1,"text":"Imagine a transparent sheet…","markups":[{"type":1,"start":86,"end":99}]}],"sections":[{"name":"cce0","startIndex":0}]},"isFullContent":false,"subtitle":"Explore the Power of Layer-based transformations and effects"},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":true,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"},"a950e6f9eb72":{"id":"a950e6f9eb72","versionId":"b007042f9c2e","creatorId":"e072cea221fc","homeCollectionId":"c72404660798","title":"Custom modifiers in Jetpack Compose","detectedLanguage":"en","latestVersion":"b007042f9c2e","latestPublishedVersion":"b007042f9c2e","hasUnpublishedEdits":false,"latestRev":293,"createdAt":1731840818531,"updatedAt":1732330459568,"acceptedAt":0,"firstPublishedAt":1732248697520,"latestPublishedAt":1732248697520,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"Modifiers in Jetpack Compose are a powerful tool for customising and enhancing UI components. They allow developers to modify the…","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"1*Oe-DGannPg34NnFtp02TjA.png","filter":"","backgroundSize":"","originalWidth":1024,"originalHeight":1024,"strategy":"resample","height":0,"width":0},"wordCount":1222,"imageCount":2,"readingTime":4.994654088050315,"subtitle":"Modifiers in Jetpack Compose are a powerful tool for customising and enhancing UI components. They allow developers to modify the…","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":15,"isBookmarked":false,"tags":[{"slug":"android","name":"Android","postCount":143707,"metadata":{"postCount":143707,"coverImage":{"id":"1*bPrF2ZemLaRrMYCmvLmWMQ.png","originalWidth":2560,"originalHeight":1280,"isFeatured":true}},"type":"Tag"},{"slug":"jetpack-compose","name":"Jetpack Compose","postCount":6081,"metadata":{"postCount":6081,"coverImage":{"id":"1*bPrF2ZemLaRrMYCmvLmWMQ.png","originalWidth":2560,"originalHeight":1280,"isFeatured":true}},"type":"Tag"},{"slug":"apps","name":"Apps","postCount":78193,"metadata":{"postCount":78193,"coverImage":{"id":"1*sidliIF2ejSZGRVk4-UYtw.jpeg","originalWidth":1024,"originalHeight":1024,"isFeatured":true}},"type":"Tag"},{"slug":"development","name":"Development","postCount":112909,"metadata":{"postCount":112909,"coverImage":{"id":"1*DPw7pNo7fvA9rwpQ2vsvDg.jpeg","originalWidth":5940,"originalHeight":4455,"isFeatured":true}},"type":"Tag"},{"slug":"tech","name":"Tech","postCount":292154,"metadata":{"postCount":292154,"coverImage":{"id":"0*Zs_B6zDXGdgkK2jv","originalWidth":5120,"originalHeight":2880,"isFeatured":true,"unsplashPhotoId":"_nWaeTF6qo0"}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":0,"links":{"entries":[{"url":"https://www.youtube.com/watch?v=BjGX2RftXsU","alts":[],"httpStatus":200},{"url":"https://engineering.teknasyon.com/composable-modifier-vs-composed-factory-in-jetpack-compose-6cbb675b0e7b","alts":[{"type":3,"url":"medium://p/6cbb675b0e7b"},{"type":2,"url":"medium://p/6cbb675b0e7b"}],"httpStatus":200}],"version":"0.3","generatedAt":1732248698316},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":72,"sectionCount":1,"readingList":0,"topics":[{"topicId":"64756708407c","slug":"android-development","createdAt":1521652914155,"deletedAt":0,"image":{"id":"1*zLD64ewnrZ3XKBtDUMXQ-w@2x.jpeg","originalWidth":3000,"originalHeight":1997},"name":"Android Dev","description":"Building little green robots.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Android Development: Articles and News — Medium","type":"Topic"}]},"coverless":true,"slug":"custom-modifiers-in-jetpack-compose","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":true,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"custom-modifiers-in-jetpack-compose-a950e6f9eb72","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"1*Oe-DGannPg34NnFtp02TjA.png","originalWidth":1024,"originalHeight":1024,"isFeatured":true}},{"name":"4e92","type":3,"text":"Custom modifiers in Jetpack Compose","markups":[],"alignment":1},{"name":"3a16","type":1,"text":"Modifiers in Jetpack Compose are a powerful tool for customising and enhancing UI components…","markups":[],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"Modifiers in Jetpack Compose are a powerful tool for customising and enhancing UI components. They allow developers to modify the…"},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"c72404660798","isNewsletter":false,"newsletterId":"","webCanonicalUrl":"","mediumUrl":"","migrationId":"","notifyFollowers":true,"notifyTwitter":false,"notifyFacebook":false,"responseHiddenOnParentPostAt":0,"isSeries":false,"isSubscriptionLocked":false,"seriesLastAppendedAt":0,"audioVersionDurationSec":0,"sequenceId":"","isEligibleForRevenue":false,"isBlockedFromHightower":false,"deletedAt":0,"lockedPostSource":0,"hightowerMinimumGuaranteeStartsAt":0,"hightowerMinimumGuaranteeEndsAt":0,"featureLockRequestAcceptedAt":0,"mongerRequestType":1,"layerCake":4,"socialTitle":"","socialDek":"","editorialPreviewTitle":"","editorialPreviewDek":"","curationEligibleAt":0,"isProxyPost":false,"proxyPostFaviconUrl":"","proxyPostProviderName":"","proxyPostType":0,"isSuspended":false,"isLimitedState":false,"seoTitle":"","previewContent2":{"bodyModel":{"paragraphs":[{"name":"4e92","type":3,"text":"Custom modifiers in Jetpack Compose","markups":[]},{"name":"a4f2","type":4,"text":"","markups":[],"layout":1,"metadata":{"id":"1*Oe-DGannPg34NnFtp02TjA.png","originalWidth":1024,"originalHeight":1024,"isFeatured":true}},{"name":"3a16","type":1,"text":"Modifiers in Jetpack Compose are a powerful tool for customising and enhancing UI components. They allow developers to modify the appearance, behaviour, and layout of composable functions without changing their core implementation.","markups":[]},{"name":"a300","type":3,"text":"Key aspects of modifiers:","markups":[]},{"name":"87fb","type":9,"text":"Chainable: Modifiers can be chained together, allowing for multiple modifications to be applied sequentially.","markups":[{"type":1,"start":0,"end":10}]},{"name":"6e91","type":9,"text":"Reusable: Custom modifiers can…","markups":[{"type":1,"start":0,"end":9}]}],"sections":[{"name":"460f","startIndex":0}]},"isFullContent":false,"subtitle":"Modifiers in Jetpack Compose are a powerful tool for customising and enhancing UI components. They allow developers to modify the…"},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":false,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"},"2dcc4db2f76c":{"id":"2dcc4db2f76c","versionId":"46e46cbd277b","creatorId":"6d77f07dc67","homeCollectionId":"c72404660798","title":"Widgets With Glance: Beyond String States","detectedLanguage":"en","latestVersion":"46e46cbd277b","latestPublishedVersion":"46e46cbd277b","hasUnpublishedEdits":false,"latestRev":913,"createdAt":1731922725319,"updatedAt":1732244286217,"acceptedAt":0,"firstPublishedAt":1732172633504,"latestPublishedAt":1732181134034,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"Use a custom GlanceStateDefinition to manage your widget state","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"1*CRseHrplJF6Df_UEDsD73g.jpeg","filter":"","backgroundSize":"","originalWidth":1792,"originalHeight":1024,"strategy":"resample","height":0,"width":0},"wordCount":1137,"imageCount":4,"readingTime":4.990566037735849,"subtitle":"Use a custom GlanceStateDefinition to manage your widget state","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":4,"isBookmarked":false,"tags":[{"slug":"android","name":"Android","postCount":143707,"metadata":{"postCount":143707,"coverImage":{"id":"1*bPrF2ZemLaRrMYCmvLmWMQ.png","originalWidth":2560,"originalHeight":1280,"isFeatured":true}},"type":"Tag"},{"slug":"android-app-development","name":"Android App Development","postCount":48196,"metadata":{"postCount":48196,"coverImage":{"id":"1*XeP3JED3Ubhmccah7E6hYg.jpeg","originalWidth":1376,"originalHeight":768,"isFeatured":true}},"type":"Tag"},{"slug":"jetpack-glance","name":"Jetpack Glance","postCount":20,"metadata":{"postCount":20,"coverImage":{"id":"1*CRseHrplJF6Df_UEDsD73g.jpeg","originalWidth":1792,"originalHeight":1024,"isFeatured":true}},"type":"Tag"},{"slug":"widget","name":"Widget","postCount":1731,"metadata":{"postCount":1731,"coverImage":{"id":"1*vwydISeTw05p7Lx4jw7xLw.png","originalWidth":1002,"originalHeight":711,"isFeatured":true}},"type":"Tag"},{"slug":"state-management","name":"State Management","postCount":3749,"metadata":{"postCount":3749,"coverImage":{"id":"1*3nU2fwxJNvRImqX86dj0dw.png","originalWidth":2162,"originalHeight":396,"isFeatured":true}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":0,"links":{"entries":[{"url":"https://chatgpt.com/","alts":[],"httpStatus":403},{"url":"https://stackoverflow.com/a/77095689","alts":[],"httpStatus":200},{"url":"https://play.google.com/store/apps/details?id=dev.veryniche.buckaroo","alts":[],"httpStatus":200},{"url":"https://github.com/android/user-interface-samples/tree/main/AppWidget/app/src/main/java/com/example/android/appwidget/glance/weather","alts":[],"httpStatus":200},{"url":"https://github.com/KatieBarnett/MotivateMe/tree/blog/CustomGlanceStateDefinition","alts":[],"httpStatus":200},{"url":"https://medium.com/proandroiddev/widgets-with-glance-standing-out-33834eee2dee","alts":[{"type":3,"url":"medium://p/33834eee2dee"},{"type":2,"url":"medium://p/33834eee2dee"}],"httpStatus":200},{"url":"https://developer.android.com/develop/ui/compose/glance/glance-app-widget","alts":[],"httpStatus":200},{"url":"https://medium.com/proandroiddev/widgets-with-glance-blending-in-ae1e52a6cb6f","alts":[{"type":2,"url":"medium://p/ae1e52a6cb6f"},{"type":3,"url":"medium://p/ae1e52a6cb6f"}],"httpStatus":200}],"version":"0.3","generatedAt":1732181135181},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":24,"sectionCount":3,"readingList":0,"topics":[{"topicId":"64756708407c","slug":"android-development","createdAt":1521652914155,"deletedAt":0,"image":{"id":"1*zLD64ewnrZ3XKBtDUMXQ-w@2x.jpeg","originalWidth":3000,"originalHeight":1997},"name":"Android Dev","description":"Building little green robots.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Android Development: Articles and News — Medium","type":"Topic"},{"topicId":"decb52b64abf","slug":"programming","createdAt":1493934116328,"deletedAt":0,"image":{"id":"1*iPa136b1cGEO7lvoXg6uHQ@2x.jpeg","originalWidth":6016,"originalHeight":4016},"name":"Programming","description":"The good, the bad, the buggy.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Programming News and Articles — Medium","type":"Topic"}]},"coverless":true,"slug":"widgets-with-glance-beyond-string-states","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":true,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"widgets-with-glance-beyond-string-states-2dcc4db2f76c","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"1*CRseHrplJF6Df_UEDsD73g.jpeg","originalWidth":1792,"originalHeight":1024,"isFeatured":true}},{"name":"7ad1","type":3,"text":"Widgets With Glance: Beyond String States","markups":[],"alignment":1},{"name":"2aba","type":13,"text":"Use a custom GlanceStateDefinition to manage your widget…","markups":[],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"Use a custom GlanceStateDefinition to manage your widget state"},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"c72404660798","isNewsletter":false,"newsletterId":"29accbb1bb50","webCanonicalUrl":"","mediumUrl":"","migrationId":"","notifyFollowers":true,"notifyTwitter":false,"notifyFacebook":false,"responseHiddenOnParentPostAt":0,"isSeries":false,"isSubscriptionLocked":false,"seriesLastAppendedAt":0,"audioVersionDurationSec":0,"sequenceId":"","isEligibleForRevenue":false,"isBlockedFromHightower":false,"deletedAt":0,"lockedPostSource":0,"hightowerMinimumGuaranteeStartsAt":0,"hightowerMinimumGuaranteeEndsAt":0,"featureLockRequestAcceptedAt":0,"mongerRequestType":1,"layerCake":6,"socialTitle":"","socialDek":"","editorialPreviewTitle":"","editorialPreviewDek":"","curationEligibleAt":0,"isProxyPost":false,"proxyPostFaviconUrl":"","proxyPostProviderName":"","proxyPostType":0,"isSuspended":false,"isLimitedState":false,"seoTitle":"","previewContent2":{"bodyModel":{"paragraphs":[{"name":"7ad1","type":3,"text":"Widgets With Glance: Beyond String States","markups":[]},{"name":"2aba","type":13,"text":"Use a custom GlanceStateDefinition to manage your widget state","markups":[]},{"name":"5e8d","type":1,"text":"This the next in my series of blog posts all about widgets. Check out Widgets with Glance: Blending in and Widgets with Glance: Standing out for some Widget UI tricks and tips.","markups":[{"type":3,"start":70,"end":102,"href":"https://medium.com/proandroiddev/widgets-with-glance-blending-in-ae1e52a6cb6f","title":"","rel":"","anchorType":0},{"type":3,"start":107,"end":140,"href":"https://medium.com/proandroiddev/widgets-with-glance-standing-out-33834eee2dee","title":"","rel":"","anchorType":0},{"type":2,"start":0,"end":176}]},{"name":"653e","type":4,"text":"Image created by ChatGPT.","markups":[{"type":3,"start":17,"end":24,"href":"https://chatgpt.com/","title":"","rel":"","anchorType":0}],"layout":1,"metadata":{"id":"1*CRseHrplJF6Df_UEDsD73g.jpeg","originalWidth":1792,"originalHeight":1024,"isFeatured":true}},{"name":"97a4","type":1,"text":"I have recently been working on an app (Pay Day: Earnings Time Tracker) that includes a lot of…","markups":[{"type":10,"start":230,"end":262},{"type":10,"start":364,"end":371},{"type":10,"start":397,"end":402},{"type":10,"start":405,"end":410},{"type":3,"start":40,"end":70,"href":"https://play.google.com/store/apps/details?id=dev.veryniche.buckaroo","title":"","rel":"","anchorType":0}]}],"sections":[{"name":"da73","startIndex":0},{"name":"e92b","startIndex":3}]},"isFullContent":false,"subtitle":"Use a custom GlanceStateDefinition to manage your widget state"},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":true,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"},"aa0760383569":{"id":"aa0760383569","versionId":"07c66affabb8","creatorId":"4369a38c1d4f","homeCollectionId":"c72404660798","title":"Exploring Kotlin Coroutines through Output Questions","detectedLanguage":"en","latestVersion":"07c66affabb8","latestPublishedVersion":"07c66affabb8","hasUnpublishedEdits":false,"latestRev":453,"createdAt":1730717170973,"updatedAt":1732086615978,"acceptedAt":0,"firstPublishedAt":1731738465538,"latestPublishedAt":1732086615978,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"In this unique blog, we delve into the world of Kotlin coroutines through a series of output questions. Each question presents a distinct…","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"1*qgzGgrMeE9raugNDYbsfVQ.png","filter":"","backgroundSize":"","originalWidth":924,"originalHeight":485,"strategy":"resample","height":0,"width":0},"wordCount":2382,"imageCount":1,"readingTime":9.188679245283017,"subtitle":"In this unique blog, we delve into the world of Kotlin coroutines through a series of output questions. Each question presents a distinct…","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":21,"isBookmarked":false,"tags":[{"slug":"kotlin","name":"Kotlin","postCount":30983,"metadata":{"postCount":30983,"coverImage":{"id":"1*XeP3JED3Ubhmccah7E6hYg.jpeg","originalWidth":1376,"originalHeight":768,"isFeatured":true}},"type":"Tag"},{"slug":"android","name":"Android","postCount":143707,"metadata":{"postCount":143707,"coverImage":{"id":"1*bPrF2ZemLaRrMYCmvLmWMQ.png","originalWidth":2560,"originalHeight":1280,"isFeatured":true}},"type":"Tag"},{"slug":"kotlin-coroutines","name":"Kotlin Coroutines","postCount":1569,"metadata":{"postCount":1569,"coverImage":{"id":"1*Bhfzsp01NibPkNYmWy9YyA.png","originalWidth":1024,"originalHeight":1024,"isFeatured":true}},"type":"Tag"},{"slug":"programming","name":"Programming","postCount":448088,"metadata":{"postCount":448088,"coverImage":{"id":"1*t5dwn8IabnCdEpoO-6Toog.png","originalWidth":1920,"originalHeight":1080,"isFeatured":true,"alt":"Kubernetes"}},"type":"Tag"},{"slug":"asynchronous","name":"Asynchronous","postCount":4681,"metadata":{"postCount":4681,"coverImage":{"id":"1*rssbG59EKwyk7I8tcltgMw.png","originalWidth":1280,"originalHeight":720,"isFeatured":true,"alt":"Building Async APIs in ASP.NET Core — The Right Way"}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":1,"links":{"entries":[{"url":"https://tanyatechzone.com/2024/05/15/composing-suspend-functions/","alts":[],"httpStatus":200},{"url":"https://tanyatechzone.com/2024/02/15/kotlin-coroutines/","alts":[],"httpStatus":200},{"url":"https://tanyatechzone.com/2024/03/15/coroutine-cancellation-and-timeouts/","alts":[],"httpStatus":200},{"url":"https://tanyatechzone.com/2024/06/26/exploring-coroutinecontext/","alts":[],"httpStatus":200}],"version":"0.3","generatedAt":1732086616474},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":103,"sectionCount":1,"readingList":0,"topics":[{"topicId":"64756708407c","slug":"android-development","createdAt":1521652914155,"deletedAt":0,"image":{"id":"1*zLD64ewnrZ3XKBtDUMXQ-w@2x.jpeg","originalWidth":3000,"originalHeight":1997},"name":"Android Dev","description":"Building little green robots.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Android Development: Articles and News — Medium","type":"Topic"},{"topicId":"decb52b64abf","slug":"programming","createdAt":1493934116328,"deletedAt":0,"image":{"id":"1*iPa136b1cGEO7lvoXg6uHQ@2x.jpeg","originalWidth":6016,"originalHeight":4016},"name":"Programming","description":"The good, the bad, the buggy.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Programming News and Articles — Medium","type":"Topic"}]},"coverless":true,"slug":"exploring-kotlin-coroutines-through-output-questions","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":true,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"exploring-kotlin-coroutines-through-output-questions-aa0760383569","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"1*qgzGgrMeE9raugNDYbsfVQ.png","originalWidth":924,"originalHeight":485,"isFeatured":true}},{"name":"c941","type":3,"text":"Exploring Kotlin Coroutines through Output Questions","markups":[],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"In this unique blog, we delve into the world of Kotlin coroutines through a series of output questions. Each question presents a distinct…"},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"c72404660798","isNewsletter":false,"newsletterId":"03eae46e496b","webCanonicalUrl":"","mediumUrl":"","migrationId":"","notifyFollowers":true,"notifyTwitter":false,"notifyFacebook":false,"responseHiddenOnParentPostAt":0,"isSeries":false,"isSubscriptionLocked":false,"seriesLastAppendedAt":0,"audioVersionDurationSec":0,"sequenceId":"","isEligibleForRevenue":false,"isBlockedFromHightower":false,"deletedAt":0,"lockedPostSource":0,"hightowerMinimumGuaranteeStartsAt":0,"hightowerMinimumGuaranteeEndsAt":0,"featureLockRequestAcceptedAt":0,"mongerRequestType":1,"layerCake":6,"socialTitle":"","socialDek":"","editorialPreviewTitle":"","editorialPreviewDek":"","curationEligibleAt":0,"isProxyPost":false,"proxyPostFaviconUrl":"","proxyPostProviderName":"","proxyPostType":0,"isSuspended":false,"isLimitedState":false,"seoTitle":"","previewContent2":{"bodyModel":{"paragraphs":[{"name":"c941","type":3,"text":"Exploring Kotlin Coroutines through Output Questions","markups":[]},{"name":"d3fd","type":4,"text":"","markups":[],"layout":1,"metadata":{"id":"1*qgzGgrMeE9raugNDYbsfVQ.png","originalWidth":924,"originalHeight":485,"isFeatured":true}},{"name":"afa2","type":1,"text":"In this unique blog, we delve into the world of Kotlin coroutines through a series of output questions. Each question presents a distinct scenario, allowing us to understand and reinforce our knowledge of coroutine concepts. By exploring and analyzing the outputs, we gain a deeper understanding of the behavior and…","markups":[]}],"sections":[{"name":"2994","startIndex":0}]},"isFullContent":false,"subtitle":"In this unique blog, we delve into the world of Kotlin coroutines through a series of output questions. Each question presents a distinct…"},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":true,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"},"187d5e14d212":{"id":"187d5e14d212","versionId":"21a8c916e993","creatorId":"cb954442a18e","homeCollectionId":"c72404660798","title":"Top 10 Coroutine Mistakes We All Have Made as Android Developers","detectedLanguage":"en","latestVersion":"21a8c916e993","latestPublishedVersion":"21a8c916e993","hasUnpublishedEdits":false,"latestRev":674,"createdAt":1729930522670,"updatedAt":1731558666985,"acceptedAt":0,"firstPublishedAt":1730655021474,"latestPublishedAt":1730979901976,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"Understanding and Avoiding Common Pitfalls in Asynchronous Programming with Kotlin Coroutines","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"1*Bhfzsp01NibPkNYmWy9YyA.png","filter":"","backgroundSize":"","originalWidth":1024,"originalHeight":1024,"strategy":"resample","height":0,"width":0},"wordCount":1221,"imageCount":2,"readingTime":4.990880503144655,"subtitle":"Understanding and Avoiding Common Pitfalls in Asynchronous Programming with Kotlin Coroutines","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":110,"isBookmarked":false,"tags":[{"slug":"androiddev","name":"AndroidDev","postCount":12148,"metadata":{"postCount":12148,"coverImage":{"id":"1*XeP3JED3Ubhmccah7E6hYg.jpeg","originalWidth":1376,"originalHeight":768,"isFeatured":true}},"type":"Tag"},{"slug":"kotlin","name":"Kotlin","postCount":30983,"metadata":{"postCount":30983,"coverImage":{"id":"1*XeP3JED3Ubhmccah7E6hYg.jpeg","originalWidth":1376,"originalHeight":768,"isFeatured":true}},"type":"Tag"},{"slug":"kotlin-coroutines","name":"Kotlin Coroutines","postCount":1569,"metadata":{"postCount":1569,"coverImage":{"id":"1*Bhfzsp01NibPkNYmWy9YyA.png","originalWidth":1024,"originalHeight":1024,"isFeatured":true}},"type":"Tag"},{"slug":"android-app-development","name":"Android App Development","postCount":48196,"metadata":{"postCount":48196,"coverImage":{"id":"1*XeP3JED3Ubhmccah7E6hYg.jpeg","originalWidth":1376,"originalHeight":768,"isFeatured":true}},"type":"Tag"},{"slug":"android","name":"Android","postCount":143707,"metadata":{"postCount":143707,"coverImage":{"id":"1*bPrF2ZemLaRrMYCmvLmWMQ.png","originalWidth":2560,"originalHeight":1280,"isFeatured":true}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":4,"links":{"entries":[{"url":"mailto:dobri.kostadinov@gmail.com","alts":[],"httpStatus":0},{"url":"https://www.buymeacoffee.com/dobri.kostadinov","alts":[],"httpStatus":200},{"url":"https://medium.com/@dobri.kostadinov","alts":[{"type":2,"url":"medium://@dobri.kostadinov"},{"type":3,"url":"medium://@dobri.kostadinov"}],"httpStatus":200},{"url":"https://www.linkedin.com/in/dobrikostadinov/","alts":[],"httpStatus":999}],"version":"0.3","generatedAt":1730979902864},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":502,"sectionCount":1,"readingList":0,"topics":[{"topicId":"64756708407c","slug":"android-development","createdAt":1521652914155,"deletedAt":0,"image":{"id":"1*zLD64ewnrZ3XKBtDUMXQ-w@2x.jpeg","originalWidth":3000,"originalHeight":1997},"name":"Android Dev","description":"Building little green robots.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Android Development: Articles and News — Medium","type":"Topic"},{"topicId":"decb52b64abf","slug":"programming","createdAt":1493934116328,"deletedAt":0,"image":{"id":"1*iPa136b1cGEO7lvoXg6uHQ@2x.jpeg","originalWidth":6016,"originalHeight":4016},"name":"Programming","description":"The good, the bad, the buggy.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Programming News and Articles — Medium","type":"Topic"}]},"coverless":true,"slug":"top-10-coroutine-mistakes-we-all-have-made-as-android-developers","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":true,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"top-10-coroutine-mistakes-we-all-have-made-as-android-developers-187d5e14d212","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"1*Bhfzsp01NibPkNYmWy9YyA.png","originalWidth":1024,"originalHeight":1024,"isFeatured":true}},{"name":"acbe","type":3,"text":"Top 10 Coroutine Mistakes We All Have Made as Android Developers","markups":[],"alignment":1},{"name":"e240","type":13,"text":"Understanding and Avoiding Common…","markups":[],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"Understanding and Avoiding Common Pitfalls in Asynchronous Programming with Kotlin Coroutines"},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"c72404660798","isNewsletter":false,"newsletterId":"f4f4c7b250da","webCanonicalUrl":"","mediumUrl":"","migrationId":"","notifyFollowers":true,"notifyTwitter":false,"notifyFacebook":false,"responseHiddenOnParentPostAt":0,"isSeries":false,"isSubscriptionLocked":false,"seriesLastAppendedAt":0,"audioVersionDurationSec":0,"sequenceId":"","isEligibleForRevenue":false,"isBlockedFromHightower":false,"deletedAt":0,"lockedPostSource":0,"hightowerMinimumGuaranteeStartsAt":0,"hightowerMinimumGuaranteeEndsAt":0,"featureLockRequestAcceptedAt":0,"mongerRequestType":1,"layerCake":6,"socialTitle":"","socialDek":"","editorialPreviewTitle":"","editorialPreviewDek":"","curationEligibleAt":0,"isProxyPost":false,"proxyPostFaviconUrl":"","proxyPostProviderName":"","proxyPostType":0,"isSuspended":false,"isLimitedState":false,"seoTitle":"","previewContent2":{"bodyModel":{"paragraphs":[{"name":"acbe","type":3,"text":"Top 10 Coroutine Mistakes We All Have Made as Android Developers","markups":[]},{"name":"e240","type":13,"text":"Understanding and Avoiding Common Pitfalls in Asynchronous Programming with Kotlin Coroutines","markups":[]},{"name":"da6f","type":4,"text":"This image was generated with the assistance of AI","markups":[],"layout":1,"metadata":{"id":"1*Bhfzsp01NibPkNYmWy9YyA.png","originalWidth":1024,"originalHeight":1024,"isFeatured":true}},{"name":"3c3b","type":3,"text":"Introduction","markups":[]},{"name":"dd1d","type":1,"text":"As Android developers, Kotlin coroutines have become an indispensable tool in our asynchronous programming toolkit. They simplify concurrent tasks, make code more readable, and help us avoid the callback hell that was prevalent with earlier approaches. However, coroutines come with their own set of challenges, and it’s easy to fall…","markups":[]}],"sections":[{"name":"c878","startIndex":0}]},"isFullContent":false,"subtitle":"Understanding and Avoiding Common Pitfalls in Asynchronous Programming with Kotlin Coroutines"},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":true,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"},"05e8fe2acd2c":{"id":"05e8fe2acd2c","versionId":"43467db70516","creatorId":"9bb203a4ab2e","homeCollectionId":"c72404660798","title":"Top Nine Android Developer Interview Questions You Should Know","detectedLanguage":"en","latestVersion":"43467db70516","latestPublishedVersion":"43467db70516","hasUnpublishedEdits":false,"latestRev":1590,"createdAt":1731030875512,"updatedAt":1731533186783,"acceptedAt":0,"firstPublishedAt":1731114590956,"latestPublishedAt":1731198289448,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"When applying for a job as an Android developer, you’ll need expertise in Android, Kotlin, and other relevant skills, depending on the team…","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"1*QhM1jZ56sVMbyc0hgOgRPw.jpeg","filter":"","backgroundSize":"","originalWidth":4608,"originalHeight":3072,"strategy":"resample","height":0,"width":0},"wordCount":3804,"imageCount":3,"readingTime":14.904716981132076,"subtitle":"When applying for a job as an Android developer, you’ll need expertise in Android, Kotlin, and other relevant skills, depending on the team…","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":74,"isBookmarked":false,"tags":[{"slug":"android","name":"Android","postCount":143707,"metadata":{"postCount":143707,"coverImage":{"id":"1*bPrF2ZemLaRrMYCmvLmWMQ.png","originalWidth":2560,"originalHeight":1280,"isFeatured":true}},"type":"Tag"},{"slug":"kotlin","name":"Kotlin","postCount":30983,"metadata":{"postCount":30983,"coverImage":{"id":"1*XeP3JED3Ubhmccah7E6hYg.jpeg","originalWidth":1376,"originalHeight":768,"isFeatured":true}},"type":"Tag"},{"slug":"jetpack-compose","name":"Jetpack Compose","postCount":6081,"metadata":{"postCount":6081,"coverImage":{"id":"1*bPrF2ZemLaRrMYCmvLmWMQ.png","originalWidth":2560,"originalHeight":1280,"isFeatured":true}},"type":"Tag"},{"slug":"androiddev","name":"AndroidDev","postCount":12148,"metadata":{"postCount":12148,"coverImage":{"id":"1*XeP3JED3Ubhmccah7E6hYg.jpeg","originalWidth":1376,"originalHeight":768,"isFeatured":true}},"type":"Tag"},{"slug":"android-app-development","name":"Android App Development","postCount":48196,"metadata":{"postCount":48196,"coverImage":{"id":"1*XeP3JED3Ubhmccah7E6hYg.jpeg","originalWidth":1376,"originalHeight":768,"isFeatured":true}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":2,"links":{"entries":[{"url":"https://android-developers.googleblog.com/2021/07/jetpack-compose-announcement.html","alts":[],"httpStatus":200},{"url":"https://x.com/AndroidDev/status/1726662755724181663","alts":[],"httpStatus":200},{"url":"https://developer.android.com/kotlin/first","alts":[],"httpStatus":200},{"url":"https://github.com/doveletter/","alts":[],"httpStatus":200},{"url":"https://github.com/doveletter","alts":[],"httpStatus":200},{"url":"https://developer.android.com/develop/ui/compose/state-hoisting","alts":[],"httpStatus":200},{"url":"https://github.com/skydoves","alts":[],"httpStatus":200},{"url":"https://kotlinlang.org/docs/coroutines-overview.html","alts":[],"httpStatus":200},{"url":"https://kotlinlang.org/docs/data-classes.html","alts":[],"httpStatus":200},{"url":"https://kotlinlang.org/docs/extensions.html","alts":[],"httpStatus":200},{"url":"https://medium.com/@skydoves/learn-kotlin-and-android-with-dove-letter-26265da11903","alts":[{"type":3,"url":"medium://p/26265da11903"},{"type":2,"url":"medium://p/26265da11903"}],"httpStatus":200},{"url":"https://developer.android.com/about/versions/15","alts":[],"httpStatus":200},{"url":"https://developer.android.com/develop/ui/compose/side-effects","alts":[],"httpStatus":200},{"url":"https://developer.android.com/guide/components/activities/activity-lifecycle","alts":[],"httpStatus":200},{"url":"https://developer.android.com/reference/android/app/Activity","alts":[],"httpStatus":200}],"version":"0.3","generatedAt":1731198290807},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":465,"sectionCount":1,"readingList":0,"topics":[{"topicId":"64756708407c","slug":"android-development","createdAt":1521652914155,"deletedAt":0,"image":{"id":"1*zLD64ewnrZ3XKBtDUMXQ-w@2x.jpeg","originalWidth":3000,"originalHeight":1997},"name":"Android Dev","description":"Building little green robots.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Android Development: Articles and News — Medium","type":"Topic"},{"topicId":"decb52b64abf","slug":"programming","createdAt":1493934116328,"deletedAt":0,"image":{"id":"1*iPa136b1cGEO7lvoXg6uHQ@2x.jpeg","originalWidth":6016,"originalHeight":4016},"name":"Programming","description":"The good, the bad, the buggy.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Programming News and Articles — Medium","type":"Topic"}]},"coverless":true,"slug":"top-9-android-developer-interview-questions-you-should-know","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":true,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"top-9-android-developer-interview-questions-you-should-know-05e8fe2acd2c","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"1*QhM1jZ56sVMbyc0hgOgRPw.jpeg","originalWidth":4608,"originalHeight":3072,"isFeatured":true}},{"name":"99ca","type":3,"text":"Top Nine Android Developer Interview Questions You Should Know","markups":[],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"When applying for a job as an Android developer, you’ll need expertise in Android, Kotlin, and other relevant skills, depending on the team…"},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"c72404660798","isNewsletter":false,"newsletterId":"cb664a72577e","webCanonicalUrl":"","mediumUrl":"","migrationId":"","notifyFollowers":true,"notifyTwitter":false,"notifyFacebook":false,"responseHiddenOnParentPostAt":0,"isSeries":false,"isSubscriptionLocked":false,"seriesLastAppendedAt":0,"audioVersionDurationSec":0,"sequenceId":"","isEligibleForRevenue":false,"isBlockedFromHightower":false,"deletedAt":0,"lockedPostSource":0,"hightowerMinimumGuaranteeStartsAt":0,"hightowerMinimumGuaranteeEndsAt":0,"featureLockRequestAcceptedAt":0,"mongerRequestType":1,"layerCake":4,"socialTitle":"","socialDek":"","editorialPreviewTitle":"","editorialPreviewDek":"","curationEligibleAt":0,"isProxyPost":false,"proxyPostFaviconUrl":"","proxyPostProviderName":"","proxyPostType":0,"isSuspended":false,"isLimitedState":false,"seoTitle":"","previewContent2":{"bodyModel":{"paragraphs":[{"name":"6d48","type":4,"text":"Unsplash@adolfofelix","markups":[],"layout":1,"metadata":{"id":"1*QhM1jZ56sVMbyc0hgOgRPw.jpeg","originalWidth":4608,"originalHeight":3072,"isFeatured":true}},{"name":"99ca","type":3,"text":"Top Nine Android Developer Interview Questions You Should Know","markups":[]},{"name":"b063","type":1,"text":"When applying for a job as an Android developer, you’ll need expertise in Android, Kotlin, and other relevant skills, depending on the team you’re joining. While it’s impossible to predict every interview question, you can prepare by mastering the fundamental knowledge essential for working as an Android developer.","markups":[],"hasDropCap":true},{"name":"e133","type":1,"text":"The best…","markups":[]}],"sections":[{"name":"6564","startIndex":0}]},"isFullContent":false,"subtitle":"When applying for a job as an Android developer, you’ll need expertise in Android, Kotlin, and other relevant skills, depending on the team…"},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":true,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"},"12f6a9939053":{"id":"12f6a9939053","versionId":"3f00ad53f67e","creatorId":"b48b9b0e3d4d","homeCollectionId":"c72404660798","title":"The two best ways to secure your API keys in Android projects","detectedLanguage":"en","latestVersion":"3f00ad53f67e","latestPublishedVersion":"3f00ad53f67e","hasUnpublishedEdits":false,"latestRev":635,"createdAt":1730642016776,"updatedAt":1731555816817,"acceptedAt":0,"firstPublishedAt":1730737722201,"latestPublishedAt":1730765589277,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"Protecting your Android app’s API keys ensures the privacy of user information and secures any unauthorized access to your APIs, this is…","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"1*ba3JJ-JCIWGZJi94UTnThw.png","filter":"","backgroundSize":"","originalWidth":1280,"originalHeight":720,"strategy":"resample","height":0,"width":0},"wordCount":925,"imageCount":5,"readingTime":4.323899371069182,"subtitle":"Protecting your Android app’s API keys ensures the privacy of user information and secures any unauthorized access to your APIs, this is…","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":67,"isBookmarked":false,"tags":[{"slug":"android","name":"Android","postCount":143707,"metadata":{"postCount":143707,"coverImage":{"id":"1*bPrF2ZemLaRrMYCmvLmWMQ.png","originalWidth":2560,"originalHeight":1280,"isFeatured":true}},"type":"Tag"},{"slug":"kotlin","name":"Kotlin","postCount":30983,"metadata":{"postCount":30983,"coverImage":{"id":"1*XeP3JED3Ubhmccah7E6hYg.jpeg","originalWidth":1376,"originalHeight":768,"isFeatured":true}},"type":"Tag"},{"slug":"gradle","name":"Gradle","postCount":2909,"metadata":{"postCount":2909,"coverImage":{"id":"1*ba3JJ-JCIWGZJi94UTnThw.png","originalWidth":1280,"originalHeight":720,"isFeatured":true}},"type":"Tag"},{"slug":"androiddev","name":"AndroidDev","postCount":12148,"metadata":{"postCount":12148,"coverImage":{"id":"1*XeP3JED3Ubhmccah7E6hYg.jpeg","originalWidth":1376,"originalHeight":768,"isFeatured":true}},"type":"Tag"},{"slug":"android-app-development","name":"Android App Development","postCount":48196,"metadata":{"postCount":48196,"coverImage":{"id":"1*XeP3JED3Ubhmccah7E6hYg.jpeg","originalWidth":1376,"originalHeight":768,"isFeatured":true}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":9,"links":{"entries":[],"version":"0.3","generatedAt":1730765589446},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":208,"sectionCount":1,"readingList":0,"topics":[{"topicId":"64756708407c","slug":"android-development","createdAt":1521652914155,"deletedAt":0,"image":{"id":"1*zLD64ewnrZ3XKBtDUMXQ-w@2x.jpeg","originalWidth":3000,"originalHeight":1997},"name":"Android Dev","description":"Building little green robots.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Android Development: Articles and News — Medium","type":"Topic"}]},"coverless":true,"slug":"the-2-best-ways-to-secure-your-api-keys-in-android-projects","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":false,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"the-2-best-ways-to-secure-your-api-keys-in-android-projects-12f6a9939053","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"1*ba3JJ-JCIWGZJi94UTnThw.png","originalWidth":1280,"originalHeight":720,"isFeatured":true}},{"name":"2f8c","type":3,"text":"The two best ways to secure your API keys in Android projects","markups":[],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"Protecting your Android app’s API keys ensures the privacy of user information and secures any unauthorized access to your APIs, this is…"},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"c72404660798","isNewsletter":false,"newsletterId":"f0863d88471e","webCanonicalUrl":"","mediumUrl":"","migrationId":"","notifyFollowers":true,"notifyTwitter":false,"notifyFacebook":false,"responseHiddenOnParentPostAt":0,"isSeries":false,"isSubscriptionLocked":false,"seriesLastAppendedAt":0,"audioVersionDurationSec":0,"sequenceId":"","isEligibleForRevenue":false,"isBlockedFromHightower":false,"deletedAt":0,"lockedPostSource":0,"hightowerMinimumGuaranteeStartsAt":0,"hightowerMinimumGuaranteeEndsAt":0,"featureLockRequestAcceptedAt":0,"mongerRequestType":1,"layerCake":6,"socialTitle":"","socialDek":"","editorialPreviewTitle":"","editorialPreviewDek":"","curationEligibleAt":0,"isProxyPost":false,"proxyPostFaviconUrl":"","proxyPostProviderName":"","proxyPostType":0,"isSuspended":false,"isLimitedState":false,"seoTitle":"","previewContent2":{"bodyModel":{"paragraphs":[{"name":"2f8c","type":3,"text":"The two best ways to secure your API keys in Android projects","markups":[]},{"name":"0930","type":4,"text":"","markups":[],"layout":1,"metadata":{"id":"1*ba3JJ-JCIWGZJi94UTnThw.png","originalWidth":1280,"originalHeight":720,"isFeatured":true}},{"name":"e44d","type":1,"text":"Protecting your Android app’s API keys ensures the privacy of user information and secures any unauthorized access to your APIs, this is important and every application should make sure to secure their API keys to prevent any misuse of their services.","markups":[]},{"name":"92e6","type":6,"text":"NOTE: There are always some ways a hacker can…","markups":[]}],"sections":[{"name":"7150","startIndex":0}]},"isFullContent":false,"subtitle":"Protecting your Android app’s API keys ensures the privacy of user information and secures any unauthorized access to your APIs, this is…"},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":true,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"},"14d04ec2426a":{"id":"14d04ec2426a","versionId":"823d5bfa0cb1","creatorId":"4ced6b06c2b7","homeCollectionId":"c72404660798","title":"Mastering Android ViewModels: Essential Dos and Don’ts Part 5 🛠️5️⃣","detectedLanguage":"en","latestVersion":"823d5bfa0cb1","latestPublishedVersion":"823d5bfa0cb1","hasUnpublishedEdits":false,"latestRev":476,"createdAt":1725078733115,"updatedAt":1731581452458,"acceptedAt":0,"firstPublishedAt":1729974781088,"latestPublishedAt":1729974781088,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"keep these in mind for better code quality when doing ViewModels!","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"1*XDoCaRPSQa-h0DqkT5ckmA.png","filter":"","backgroundSize":"","originalWidth":1080,"originalHeight":500,"strategy":"resample","height":0,"width":0},"wordCount":749,"imageCount":1,"readingTime":3.026415094339623,"subtitle":"keep these in mind for better code quality when doing ViewModels!","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":44,"isBookmarked":false,"tags":[{"slug":"viewmodel","name":"Viewmodel","postCount":632,"metadata":{"postCount":632,"coverImage":{"id":"1*XDoCaRPSQa-h0DqkT5ckmA.png","originalWidth":1080,"originalHeight":500,"isFeatured":true}},"type":"Tag"},{"slug":"viewmodel-testing","name":"Viewmodel Testing","postCount":4,"metadata":{"postCount":4,"coverImage":{"id":"1*XDoCaRPSQa-h0DqkT5ckmA.png","originalWidth":1080,"originalHeight":500,"isFeatured":true}},"type":"Tag"},{"slug":"android","name":"Android","postCount":143707,"metadata":{"postCount":143707,"coverImage":{"id":"1*bPrF2ZemLaRrMYCmvLmWMQ.png","originalWidth":2560,"originalHeight":1280,"isFeatured":true}},"type":"Tag"},{"slug":"kotlin","name":"Kotlin","postCount":30983,"metadata":{"postCount":30983,"coverImage":{"id":"1*XeP3JED3Ubhmccah7E6hYg.jpeg","originalWidth":1376,"originalHeight":768,"isFeatured":true}},"type":"Tag"},{"slug":"performance","name":"Performance","postCount":29126,"metadata":{"postCount":29126,"coverImage":{"id":"1*KNsJIR3pEoni-r-QimaAjQ.jpeg","originalWidth":976,"originalHeight":549}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":0,"links":{"entries":[{"url":"https://www.youtube.com/@DroidFly","alts":[{"type":2,"url":"vnd.youtube://www.youtube.com/channel/UCQrQ-5TMazeb_ut7jyqvCEg"},{"type":3,"url":"https://www.youtube.com/channel/UCQrQ-5TMazeb_ut7jyqvCEg?feature=applinks"}],"httpStatus":200},{"url":"https://github.com/LloydBlv/GoodDictionary/blob/main/ui/words-list/src/test/java/com/example/words_list/WordsListViewModelTest.kt","alts":[],"httpStatus":200},{"url":"https://github.com/cashapp/turbine","alts":[],"httpStatus":200},{"url":"https://proandroiddev.com/mastering-android-viewmodels-essential-dos-and-donts-part-3-%EF%B8%8F3%EF%B8%8F%E2%83%A3-1833ce3ddd2b","alts":[{"type":3,"url":"medium://p/1833ce3ddd2b"},{"type":2,"url":"medium://p/1833ce3ddd2b"}],"httpStatus":200},{"url":"https://proandroiddev.com/mastering-android-viewmodels-essential-dos-and-donts-part-2-%EF%B8%8F-2b49281f0029","alts":[{"type":3,"url":"medium://p/2b49281f0029"},{"type":2,"url":"medium://p/2b49281f0029"}],"httpStatus":200},{"url":"https://proandroiddev.com/mastering-android-viewmodels-essential-dos-and-donts-part-1-%EF%B8%8F-bdf05287bca9","alts":[{"type":3,"url":"medium://p/bdf05287bca9"},{"type":2,"url":"medium://p/bdf05287bca9"}],"httpStatus":200},{"url":"https://mentorcruise.com/mentor/rezanajafi/","alts":[],"httpStatus":200},{"url":"https://proandroiddev.com/mastering-android-viewmodels-essential-dos-and-donts-part-4-%EF%B8%8F-a0bad53cebd2","alts":[{"type":3,"url":"medium://p/a0bad53cebd2"},{"type":2,"url":"medium://p/a0bad53cebd2"}],"httpStatus":200}],"version":"0.3","generatedAt":1729974782747},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":212,"sectionCount":5,"readingList":0,"topics":[{"topicId":"64756708407c","slug":"android-development","createdAt":1521652914155,"deletedAt":0,"image":{"id":"1*zLD64ewnrZ3XKBtDUMXQ-w@2x.jpeg","originalWidth":3000,"originalHeight":1997},"name":"Android Dev","description":"Building little green robots.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Android Development: Articles and News — Medium","type":"Topic"}]},"coverless":true,"slug":"mastering-android-viewmodels-essential-dos-and-donts-part-5-️5️⃣","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":true,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"mastering-android-viewmodels-essential-dos-and-donts-part-5-️5️⃣-14d04ec2426a","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"1*XDoCaRPSQa-h0DqkT5ckmA.png","originalWidth":1080,"originalHeight":500,"isFeatured":true}},{"name":"8aad","type":3,"text":"Mastering Android ViewModels: Essential Dos and Don’ts Part 5 🛠️5️⃣","markups":[],"alignment":1},{"name":"d05b","type":13,"text":"keep these in mind for better…","markups":[],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"keep these in mind for better code quality when doing ViewModels!"},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"c72404660798","isNewsletter":false,"newsletterId":"c7ff7cb23814","webCanonicalUrl":"","mediumUrl":"","migrationId":"","notifyFollowers":true,"notifyTwitter":false,"notifyFacebook":false,"responseHiddenOnParentPostAt":0,"isSeries":false,"isSubscriptionLocked":false,"seriesLastAppendedAt":0,"audioVersionDurationSec":0,"sequenceId":"","isEligibleForRevenue":false,"isBlockedFromHightower":false,"deletedAt":0,"lockedPostSource":0,"hightowerMinimumGuaranteeStartsAt":0,"hightowerMinimumGuaranteeEndsAt":0,"featureLockRequestAcceptedAt":0,"mongerRequestType":1,"layerCake":6,"socialTitle":"","socialDek":"","editorialPreviewTitle":"","editorialPreviewDek":"","curationEligibleAt":0,"isProxyPost":false,"proxyPostFaviconUrl":"","proxyPostProviderName":"","proxyPostType":0,"isSuspended":false,"isLimitedState":false,"seoTitle":"","previewContent2":{"bodyModel":{"paragraphs":[{"name":"8aad","type":3,"text":"Mastering Android ViewModels: Essential Dos and Don’ts Part 5 🛠️5️⃣","markups":[]},{"name":"d05b","type":13,"text":"keep these in mind for better code quality when doing ViewModels!","markups":[]},{"name":"551a","type":4,"text":"","markups":[],"layout":1,"metadata":{"id":"1*XDoCaRPSQa-h0DqkT5ckmA.png","originalWidth":1080,"originalHeight":500,"isFeatured":true}},{"name":"c347","type":1,"text":"This will be the fifth installment in our series “Mastering Android ViewModels” where we dive deep into the essential dos and don’ts that can elevate your Android development skills. We’ve already covered several tips to improve performance and code quality in ViewModels, which have become an integral part of modern…","markups":[{"type":1,"start":49,"end":79}]}],"sections":[{"name":"fcab","startIndex":0}]},"isFullContent":false,"subtitle":"keep these in mind for better code quality when doing ViewModels!"},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":true,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"},"138d3496c624":{"id":"138d3496c624","versionId":"b1fa5ac7a10e","creatorId":"727137e47bff","homeCollectionId":"c72404660798","title":"Animation and Masking in Jetpack Compose with the grahpicsLayer() and Drawing Modifiers","detectedLanguage":"en","latestVersion":"b1fa5ac7a10e","latestPublishedVersion":"b1fa5ac7a10e","hasUnpublishedEdits":false,"latestRev":3026,"createdAt":1725184536740,"updatedAt":1732474624706,"acceptedAt":0,"firstPublishedAt":1727039330503,"latestPublishedAt":1732474624706,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"Using the graphicsLayer(), CompositingStrategy and drawing modifiers for masking and animating content in Jetpack Compose.","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"1*KALhC6r9lo-8E_M7QGVvhw.png","filter":"","backgroundSize":"","originalWidth":1500,"originalHeight":500,"strategy":"resample","height":0,"width":0},"wordCount":2766,"imageCount":13,"readingTime":11.837735849056605,"subtitle":"Using the graphicsLayer(), CompositingStrategy and drawing modifiers for masking and animating content in Jetpack Compose.","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":48,"isBookmarked":false,"tags":[{"slug":"android","name":"Android","postCount":143707,"metadata":{"postCount":143707,"coverImage":{"id":"1*bPrF2ZemLaRrMYCmvLmWMQ.png","originalWidth":2560,"originalHeight":1280,"isFeatured":true}},"type":"Tag"},{"slug":"jetpack-compose","name":"Jetpack Compose","postCount":6081,"metadata":{"postCount":6081,"coverImage":{"id":"1*bPrF2ZemLaRrMYCmvLmWMQ.png","originalWidth":2560,"originalHeight":1280,"isFeatured":true}},"type":"Tag"},{"slug":"kotlin","name":"Kotlin","postCount":30983,"metadata":{"postCount":30983,"coverImage":{"id":"1*XeP3JED3Ubhmccah7E6hYg.jpeg","originalWidth":1376,"originalHeight":768,"isFeatured":true}},"type":"Tag"},{"slug":"animation","name":"Animation","postCount":27653,"metadata":{"postCount":27653,"coverImage":{"id":"1*Vq-TrgxveQeOyiBvQ-PJlQ@2x.jpeg","originalWidth":3240,"originalHeight":4860,"isFeatured":true}},"type":"Tag"},{"slug":"mobile-development","name":"Mobile Development","postCount":3414,"metadata":{"postCount":3414,"coverImage":{"id":"0*S5X9VmClO9QS6vf_","originalWidth":6400,"originalHeight":3600,"isFeatured":true,"unsplashPhotoId":"OKjJZNTl004"}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":1,"links":{"entries":[{"url":"https://developer.android.com/develop/ui/compose/animation/choose-api","alts":[],"httpStatus":200},{"url":"https://developer.android.com/develop/ui/compose/graphics/draw/modifiers#graphics-modifiers","alts":[],"httpStatus":200},{"url":"https://en.wikipedia.org/wiki/B%C3%A9zier_curve","alts":[],"httpStatus":200},{"url":"https://developer.android.com/studio/debug/layout-inspector","alts":[],"httpStatus":200},{"url":"https://developer.android.com/develop/ui/compose/graphics/draw/modifiers#drawing-modifiers","alts":[],"httpStatus":200},{"url":"https://developer.android.com/reference/kotlin/androidx/compose/animation/core/Animatable","alts":[],"httpStatus":200},{"url":"https://developer.android.com/reference/kotlin/androidx/compose/ui/graphics/BlendMode","alts":[],"httpStatus":200},{"url":"https://developer.android.com/develop/ui/compose/phases","alts":[],"httpStatus":200},{"url":"https://developer.android.com/reference/kotlin/androidx/compose/animation/core/InfiniteTransition","alts":[],"httpStatus":200},{"url":"https://developer.android.com/develop/ui/compose/graphics/draw/modifiers#drawwithcontent","alts":[],"httpStatus":200},{"url":"https://developer.android.com/reference/kotlin/androidx/compose/foundation/layout/package-summary#(androidx.compose.ui.Modifier).offset(androidx.compose.ui.unit.Dp,androidx.compose.ui.unit.Dp)","alts":[],"httpStatus":200},{"url":"https://developer.android.com/develop/ui/compose/custom-modifiers#chain-existing","alts":[],"httpStatus":200},{"url":"https://developer.android.com/reference/kotlin/androidx/compose/animation/core/package-summary#LinearEasing()","alts":[],"httpStatus":200},{"url":"https://developer.android.com/develop/ui/compose/graphics/draw/modifiers#drawwithcache","alts":[],"httpStatus":200},{"url":"https://developer.android.com/develop/ui/compose/graphics/draw/modifiers#drawbehind","alts":[],"httpStatus":200},{"url":"https://developer.android.com/reference/kotlin/androidx/compose/foundation/layout/package-summary#(androidx.compose.ui.Modifier).offset(kotlin.Function1)","alts":[],"httpStatus":200},{"url":"https://developer.android.com/reference/kotlin/androidx/compose/animation/core/package-summary#EaseInSine()","alts":[],"httpStatus":200},{"url":"https://developer.android.com/reference/kotlin/androidx/compose/animation/core/TweenSpec","alts":[],"httpStatus":200}],"version":"0.3","generatedAt":1732474626787},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":235,"sectionCount":2,"readingList":0,"topics":[{"topicId":"64756708407c","slug":"android-development","createdAt":1521652914155,"deletedAt":0,"image":{"id":"1*zLD64ewnrZ3XKBtDUMXQ-w@2x.jpeg","originalWidth":3000,"originalHeight":1997},"name":"Android Dev","description":"Building little green robots.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Android Development: Articles and News — Medium","type":"Topic"},{"topicId":"ab3d8f7f8eb1","slug":"ios-development","createdAt":1521651850182,"deletedAt":0,"image":{"id":"1*g_B4JNulmfXSj0AyEjImyA@2x.jpeg","originalWidth":5184,"originalHeight":3456},"name":"iOS Dev","description":"Appy talk.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"iOS App Development: Articles and News — Medium","type":"Topic"},{"topicId":"decb52b64abf","slug":"programming","createdAt":1493934116328,"deletedAt":0,"image":{"id":"1*iPa136b1cGEO7lvoXg6uHQ@2x.jpeg","originalWidth":6016,"originalHeight":4016},"name":"Programming","description":"The good, the bad, the buggy.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Programming News and Articles — Medium","type":"Topic"}]},"coverless":true,"slug":"animation-and-masking-in-jetpack-compose-with-the-grahpicslayer-and-drawing-modifiers","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":false,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"animation-and-masking-in-jetpack-compose-with-the-grahpicslayer-and-drawing-modifiers-138d3496c624","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"1*KALhC6r9lo-8E_M7QGVvhw.png","originalWidth":1500,"originalHeight":500,"isFeatured":true}},{"name":"4ca5","type":3,"text":"Animation and Masking in Jetpack Compose with the grahpicsLayer() and Drawing Modifiers","markups":[],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"Using the graphicsLayer(), CompositingStrategy and drawing modifiers for masking and animating content in Jetpack Compose."},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"c72404660798","isNewsletter":false,"newsletterId":"c682bbd78f63","webCanonicalUrl":"","mediumUrl":"","migrationId":"","notifyFollowers":true,"notifyTwitter":false,"notifyFacebook":false,"responseHiddenOnParentPostAt":0,"isSeries":false,"isSubscriptionLocked":false,"seriesLastAppendedAt":0,"audioVersionDurationSec":0,"sequenceId":"","isEligibleForRevenue":false,"isBlockedFromHightower":false,"deletedAt":0,"lockedPostSource":0,"hightowerMinimumGuaranteeStartsAt":0,"hightowerMinimumGuaranteeEndsAt":0,"featureLockRequestAcceptedAt":0,"mongerRequestType":1,"layerCake":6,"socialTitle":"","socialDek":"","editorialPreviewTitle":"","editorialPreviewDek":"","curationEligibleAt":0,"isProxyPost":false,"proxyPostFaviconUrl":"","proxyPostProviderName":"","proxyPostType":0,"isSuspended":false,"isLimitedState":false,"seoTitle":"","previewContent2":{"bodyModel":{"paragraphs":[{"name":"0951","type":4,"text":"","markups":[],"layout":1,"metadata":{"id":"1*KALhC6r9lo-8E_M7QGVvhw.png","originalWidth":1500,"originalHeight":500,"isFeatured":true}},{"name":"4ca5","type":3,"text":"Animation and Masking in Jetpack Compose with the grahpicsLayer() and Drawing Modifiers","markups":[]},{"name":"eace","type":1,"text":"Jetpack Compose’s animation API is both powerful and enjoyable to work with. And when combined with the graphicsLayer() and drawing modifiers, it really open up possibilities for creating some really cool animations. In this article, we'll dive into exactly that by exploring how to create the following loading animation:","markups":[{"type":10,"start":104,"end":119},{"type":3,"start":0,"end":31,"href":"https://developer.android.com/develop/ui/compose/animation/choose-api","title":"","rel":"noopener","anchorType":0},{"type":3,"start":104,"end":119,"href":"https://developer.android.com/develop/ui/compose/graphics/draw/modifiers#graphics-modifiers","title":"","rel":"","anchorType":0}]}],"sections":[{"name":"9101","startIndex":0}]},"isFullContent":false,"subtitle":"Using the graphicsLayer(), CompositingStrategy and drawing modifiers for masking and animating content in Jetpack Compose."},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":true,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"},"07ca74eee000":{"id":"07ca74eee000","versionId":"e8516b506ee2","creatorId":"b69ba9cd4ff2","homeCollectionId":"c72404660798","title":"Android Interview Series 2024 — Part 8 (Android architecture)","detectedLanguage":"en","latestVersion":"e8516b506ee2","latestPublishedVersion":"e8516b506ee2","hasUnpublishedEdits":false,"latestRev":189,"createdAt":1731426987346,"updatedAt":1731871017018,"acceptedAt":0,"firstPublishedAt":1731427305001,"latestPublishedAt":1731871016952,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"This is Part 8 of the android interview question series. This part will focus on Android architecture.","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"0*ovGMYgU7aA9In-oV.jpeg","filter":"","backgroundSize":"","originalWidth":1920,"originalHeight":1080,"strategy":"resample","height":0,"width":0},"wordCount":2003,"imageCount":1,"readingTime":7.758490566037736,"subtitle":"This is Part 8 of the android interview question series. This part will focus on Android architecture.","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":8,"isBookmarked":false,"tags":[{"slug":"android","name":"Android","postCount":143707,"metadata":{"postCount":143707,"coverImage":{"id":"1*bPrF2ZemLaRrMYCmvLmWMQ.png","originalWidth":2560,"originalHeight":1280,"isFeatured":true}},"type":"Tag"},{"slug":"android-app-development","name":"Android App Development","postCount":48196,"metadata":{"postCount":48196,"coverImage":{"id":"1*XeP3JED3Ubhmccah7E6hYg.jpeg","originalWidth":1376,"originalHeight":768,"isFeatured":true}},"type":"Tag"},{"slug":"androiddev","name":"AndroidDev","postCount":12148,"metadata":{"postCount":12148,"coverImage":{"id":"1*XeP3JED3Ubhmccah7E6hYg.jpeg","originalWidth":1376,"originalHeight":768,"isFeatured":true}},"type":"Tag"},{"slug":"kotlin","name":"Kotlin","postCount":30983,"metadata":{"postCount":30983,"coverImage":{"id":"1*XeP3JED3Ubhmccah7E6hYg.jpeg","originalWidth":1376,"originalHeight":768,"isFeatured":true}},"type":"Tag"},{"slug":"android-architecture","name":"Android Architecture","postCount":528,"metadata":{"postCount":528,"coverImage":{"id":"1*WTiRBlAwkPdWsq1P5oQIrg.png","originalWidth":1400,"originalHeight":1120,"isFeatured":true}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":0,"links":{"entries":[{"url":"https://hdwallsbox.com/3d-android-logo-background-wallpaper-43891/","alts":[],"httpStatus":200},{"url":"https://medium.com/@anitaa_1990/android-interview-series-2024-part-2-android-intermediate-472e0e787725","alts":[{"type":3,"url":"medium://p/472e0e787725"},{"type":2,"url":"medium://p/472e0e787725"}],"httpStatus":200},{"url":"https://medium.com/@anitaa_1990/android-interview-series-2024-part-5-kotlin-coroutines-3dd1ae81c721","alts":[{"type":3,"url":"medium://p/3dd1ae81c721"},{"type":2,"url":"medium://p/3dd1ae81c721"}],"httpStatus":200},{"url":"https://medium.com/@anitaa_1990/android-interview-series-2024-part-1-android-basics-23a713f4a648","alts":[{"type":3,"url":"medium://p/23a713f4a648"},{"type":2,"url":"medium://p/23a713f4a648"}],"httpStatus":200},{"url":"https://medium.com/@anitaa_1990/android-interview-series-2024-part-4-kotlin-basics-16531ee54e8a","alts":[{"type":3,"url":"medium://p/16531ee54e8a"},{"type":2,"url":"medium://p/16531ee54e8a"}],"httpStatus":200},{"url":"https://medium.com/android-news/android-interview-questions-cheat-sheet-part-ii-bea0633f0da7","alts":[{"type":3,"url":"medium://p/bea0633f0da7"},{"type":2,"url":"medium://p/bea0633f0da7"}],"httpStatus":200},{"url":"https://medium.com/@anitaa_1990/android-interview-series-2024-part-7-jetpack-compose-ff7d2ecd9018","alts":[{"type":3,"url":"medium://p/ff7d2ecd9018"},{"type":2,"url":"medium://p/ff7d2ecd9018"}],"httpStatus":200},{"url":"https://medium.com/@anitaa_1990/android-interview-series-2024-part-6-kotlin-flows-730f6bf877df","alts":[{"type":3,"url":"medium://p/730f6bf877df"},{"type":2,"url":"medium://p/730f6bf877df"}],"httpStatus":200}],"version":"0.3","generatedAt":1731871018537},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":15,"sectionCount":2,"readingList":0,"topics":[{"topicId":"64756708407c","slug":"android-development","createdAt":1521652914155,"deletedAt":0,"image":{"id":"1*zLD64ewnrZ3XKBtDUMXQ-w@2x.jpeg","originalWidth":3000,"originalHeight":1997},"name":"Android Dev","description":"Building little green robots.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Android Development: Articles and News — Medium","type":"Topic"}]},"coverless":true,"slug":"android-interview-series-2024-part-8-android-architecture","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":false,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"android-interview-series-2024-part-8-android-architecture-07ca74eee000","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"0*ovGMYgU7aA9In-oV.jpeg","originalWidth":1920,"originalHeight":1080,"isFeatured":true}},{"name":"f148","type":3,"text":"Android Interview Series 2024 — Part 8 (Android architecture)","markups":[],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"This is Part 8 of the android interview question series. This part will focus on Android architecture."},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"c72404660798","isNewsletter":false,"newsletterId":"","webCanonicalUrl":"","mediumUrl":"","migrationId":"","notifyFollowers":true,"notifyTwitter":false,"notifyFacebook":false,"responseHiddenOnParentPostAt":0,"isSeries":false,"isSubscriptionLocked":false,"seriesLastAppendedAt":0,"audioVersionDurationSec":0,"sequenceId":"","isEligibleForRevenue":false,"isBlockedFromHightower":false,"deletedAt":0,"lockedPostSource":0,"hightowerMinimumGuaranteeStartsAt":0,"hightowerMinimumGuaranteeEndsAt":0,"featureLockRequestAcceptedAt":0,"mongerRequestType":1,"layerCake":4,"socialTitle":"","socialDek":"","editorialPreviewTitle":"","editorialPreviewDek":"","curationEligibleAt":0,"isProxyPost":false,"proxyPostFaviconUrl":"","proxyPostProviderName":"","proxyPostType":0,"isSuspended":false,"isLimitedState":false,"seoTitle":"","previewContent2":{"bodyModel":{"paragraphs":[{"name":"f148","type":3,"text":"Android Interview Series 2024 — Part 8 (Android architecture)","markups":[]},{"name":"14c4","type":4,"text":"https://hdwallsbox.com/3d-android-logo-background-wallpaper-43891/","markups":[{"type":3,"start":0,"end":66,"href":"https://hdwallsbox.com/3d-android-logo-background-wallpaper-43891/","title":"","rel":"nofollow","anchorType":0}],"layout":5,"metadata":{"id":"0*ovGMYgU7aA9In-oV.jpeg","originalWidth":1920,"originalHeight":1080,"isFeatured":true}},{"name":"77d7","type":1,"text":"This is Part 8 of the android interview question series. This part will focus on Android architecture.","markups":[]},{"name":"0e53","type":9,"text":"Part 1 — Android basics","markups":[{"type":3,"start":0,"end":23,"href":"https://medium.com/@anitaa_1990/android-interview-series-2024-part-1-android-basics-23a713f4a648","title":"","rel":"noopener","anchorType":0}]},{"name":"c452","type":9,"text":"Part 2 — Android experts","markups":[{"type":3,"start":0,"end":24,"href":"https://medium.com/@anitaa_1990/android-interview-series-2024-part-2-android-intermediate-472e0e787725","title":"","rel":"noopener","anchorType":0}]},{"name":"1611","type":9,"text":"Part 3 — Java basics","markups":[{"type":3,"start":0,"end":20,"href":"https://medium.com/android-news/android-interview-questions-cheat-sheet-part-ii-bea0633f0da7","title":"","rel":"noopener","anchorType":0}]},{"name":"4d2d","type":9,"text":"Part 4 — Kotlin basics","markups":[{"type":3,"start":0,"end":22,"href":"https://medium.com/@anitaa_1990/android-interview-series-2024-part-4-kotlin-basics-16531ee54e8a","title":"","rel":"noopener","anchorType":0}]},{"name":"33b2","type":9,"text":"Part 5 — Kotlin coroutines","markups":[{"type":3,"start":0,"end":26,"href":"https://medium.com/@anitaa_1990/android-interview-series-2024-part-5-kotlin-coroutines-3dd1ae81c721","title":"","rel":"noopener","anchorType":0}]},{"name":"8465","type":9,"text":"Part 6 — Kotlin Flows","markups":[{"type":3,"start":0,"end":21,"href":"https://medium.com/@anitaa_1990/android-interview-series-2024-part-6-kotlin-flows-730f6bf877df","title":"","rel":"noopener","anchorType":0}]},{"name":"213d","type":9,"text":"Part 7 —…","markups":[{"type":3,"start":0,"end":24,"href":"https://medium.com/@anitaa_1990/android-interview-series-2024-part-7-jetpack-compose-ff7d2ecd9018","title":"","rel":"","anchorType":0}]}],"sections":[{"name":"1d6a","startIndex":0}]},"isFullContent":false,"subtitle":"This is Part 8 of the android interview question series. This part will focus on Android architecture."},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":false,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"},"08927e4d2855":{"id":"08927e4d2855","versionId":"48b1fd128257","creatorId":"55eb0bd9ca57","homeCollectionId":"c72404660798","title":"Facing a Multithreading Tech Interview","detectedLanguage":"en","latestVersion":"48b1fd128257","latestPublishedVersion":"48b1fd128257","hasUnpublishedEdits":false,"latestRev":942,"createdAt":1727075511796,"updatedAt":1731649338238,"acceptedAt":0,"firstPublishedAt":1728883134781,"latestPublishedAt":1728883134781,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"Lessons from a Live Coding Session","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"0*wnibk_XT8sI6BUCk","filter":"","backgroundSize":"","originalWidth":6000,"originalHeight":4000,"strategy":"resample","height":0,"width":0},"wordCount":795,"imageCount":1,"readingTime":3.2,"subtitle":"Lessons from a Live Coding Session","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":32,"isBookmarked":false,"tags":[{"slug":"coroutine","name":"Coroutine","postCount":1641,"metadata":{"postCount":1641,"coverImage":{"id":"1*W0G_upXTYxYppLE7evdWlw.png","originalWidth":512,"originalHeight":361,"isFeatured":true}},"type":"Tag"},{"slug":"multithreading","name":"Multithreading","postCount":2822,"metadata":{"postCount":2822,"coverImage":{"id":"0*jcoLp8i5McumUhuC","originalWidth":1792,"originalHeight":1024,"isFeatured":true}},"type":"Tag"},{"slug":"tech-interview","name":"Tech Interview","postCount":943,"metadata":{"postCount":943,"coverImage":{"id":"1*TOAldOfeM49FClAXCBxIDQ.jpeg","originalWidth":450,"originalHeight":310,"isFeatured":true}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":2,"links":{"entries":[{"url":"https://unsplash.com?utm_source=medium&utm_medium=referral","alts":[],"httpStatus":200},{"url":"https://unsplash.com/@mineral_of_demon?utm_source=medium&utm_medium=referral","alts":[],"httpStatus":200}],"version":"0.3","generatedAt":1728883135275},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":183,"sectionCount":1,"readingList":0,"topics":[{"topicId":"64756708407c","slug":"android-development","createdAt":1521652914155,"deletedAt":0,"image":{"id":"1*zLD64ewnrZ3XKBtDUMXQ-w@2x.jpeg","originalWidth":3000,"originalHeight":1997},"name":"Android Dev","description":"Building little green robots.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Android Development: Articles and News — Medium","type":"Topic"},{"topicId":"decb52b64abf","slug":"programming","createdAt":1493934116328,"deletedAt":0,"image":{"id":"1*iPa136b1cGEO7lvoXg6uHQ@2x.jpeg","originalWidth":6016,"originalHeight":4016},"name":"Programming","description":"The good, the bad, the buggy.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Programming News and Articles — Medium","type":"Topic"}]},"coverless":true,"slug":"facing-a-multithreading-tech-interview","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":true,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"facing-a-multithreading-tech-interview-08927e4d2855","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"0*wnibk_XT8sI6BUCk","originalWidth":6000,"originalHeight":4000,"isFeatured":true,"unsplashPhotoId":"49CyfcBLDY8"}},{"name":"e0cc","type":3,"text":"Facing a Multithreading Tech Interview","markups":[],"alignment":1},{"name":"1230","type":13,"text":"Lessons from a Live Coding Session","markups":[],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"Lessons from a Live Coding Session"},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"c72404660798","isNewsletter":false,"newsletterId":"d0d6546383c8","webCanonicalUrl":"","mediumUrl":"","migrationId":"","notifyFollowers":true,"notifyTwitter":false,"notifyFacebook":false,"responseHiddenOnParentPostAt":0,"isSeries":false,"isSubscriptionLocked":false,"seriesLastAppendedAt":0,"audioVersionDurationSec":0,"sequenceId":"","isEligibleForRevenue":false,"isBlockedFromHightower":false,"deletedAt":0,"lockedPostSource":0,"hightowerMinimumGuaranteeStartsAt":0,"hightowerMinimumGuaranteeEndsAt":0,"featureLockRequestAcceptedAt":0,"mongerRequestType":1,"layerCake":6,"socialTitle":"","socialDek":"","editorialPreviewTitle":"","editorialPreviewDek":"","curationEligibleAt":0,"isProxyPost":false,"proxyPostFaviconUrl":"","proxyPostProviderName":"","proxyPostType":0,"isSuspended":false,"isLimitedState":false,"seoTitle":"","previewContent2":{"bodyModel":{"paragraphs":[{"name":"f8c3","type":4,"text":"Photo by Nastia Petruk on Unsplash","markups":[{"type":3,"start":9,"end":22,"href":"https://unsplash.com/@mineral_of_demon?utm_source=medium&utm_medium=referral","title":"","rel":"photo-creator","anchorType":0},{"type":3,"start":26,"end":34,"href":"https://unsplash.com?utm_source=medium&utm_medium=referral","title":"","rel":"photo-source","anchorType":0}],"layout":3,"metadata":{"id":"0*wnibk_XT8sI6BUCk","originalWidth":6000,"originalHeight":4000,"isFeatured":true,"unsplashPhotoId":"49CyfcBLDY8"}},{"name":"e0cc","type":3,"text":"Facing a Multithreading Tech Interview","markups":[]},{"name":"1230","type":13,"text":"Lessons from a Live Coding Session","markups":[]},{"name":"aad9","type":3,"text":"Motivation","markups":[]},{"name":"f35b","type":1,"text":"I’ve recently gone through several interesting tech interviews and one of the new challenges for me was a multithreading interview. It was a one-hour live-coding session where I had to solve typical Android multithreading issues. Even though I have experience with threads and coroutines, it was still a challenge. The…","markups":[]}],"sections":[{"name":"f491","startIndex":0}]},"isFullContent":false,"subtitle":"Lessons from a Live Coding Session"},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":true,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"},"14d04ea18e1a":{"id":"14d04ea18e1a","versionId":"a3582a2f2c9c","creatorId":"bc628276716f","homeCollectionId":"c72404660798","title":"How to use Koin scopes with Decompose components?","detectedLanguage":"en","latestVersion":"a3582a2f2c9c","latestPublishedVersion":"a3582a2f2c9c","hasUnpublishedEdits":false,"latestRev":357,"createdAt":1730751602511,"updatedAt":1731555714796,"acceptedAt":0,"firstPublishedAt":1730756854384,"latestPublishedAt":1731055011050,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"In this article I’d like to share the approach of how I resolved the issue with the registration of the big amount of named dependencies by…","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"0*eru2Zt27h8fGOHgx","filter":"","backgroundSize":"","originalWidth":1024,"originalHeight":1024,"strategy":"resample","height":0,"width":0},"wordCount":552,"imageCount":2,"readingTime":2.4663522012578616,"subtitle":"In this article I’d like to share the approach of how I resolved the issue with the registration of the big amount of named dependencies by…","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":8,"isBookmarked":false,"tags":[{"slug":"kotlin-multiplatform","name":"Kotlin Multiplatform","postCount":1398,"metadata":{"postCount":1398,"coverImage":{"id":"1*8kMaRJPi-HkK7N_ccEyAGw.png","originalWidth":470,"originalHeight":266,"isFeatured":true}},"type":"Tag"},{"slug":"koin","name":"Koin","postCount":565,"metadata":{"postCount":565,"coverImage":{"id":"1*8kMaRJPi-HkK7N_ccEyAGw.png","originalWidth":470,"originalHeight":266,"isFeatured":true}},"type":"Tag"},{"slug":"android","name":"Android","postCount":143707,"metadata":{"postCount":143707,"coverImage":{"id":"1*bPrF2ZemLaRrMYCmvLmWMQ.png","originalWidth":2560,"originalHeight":1280,"isFeatured":true}},"type":"Tag"},{"slug":"androiddev","name":"AndroidDev","postCount":12148,"metadata":{"postCount":12148,"coverImage":{"id":"1*XeP3JED3Ubhmccah7E6hYg.jpeg","originalWidth":1376,"originalHeight":768,"isFeatured":true}},"type":"Tag"},{"slug":"android-app-development","name":"Android App Development","postCount":48196,"metadata":{"postCount":48196,"coverImage":{"id":"1*XeP3JED3Ubhmccah7E6hYg.jpeg","originalWidth":1376,"originalHeight":768,"isFeatured":true}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":0,"links":{"entries":[{"url":"https://insert-koin.io/docs/reference/koin-core/scopes/#what-is-a-scope","alts":[],"httpStatus":200},{"url":"https://www.linkedin.com/in/sergei-mikhailovskii-bb4951158/","alts":[],"httpStatus":999}],"version":"0.3","generatedAt":1731055011801},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":69,"sectionCount":1,"readingList":0,"topics":[{"topicId":"64756708407c","slug":"android-development","createdAt":1521652914155,"deletedAt":0,"image":{"id":"1*zLD64ewnrZ3XKBtDUMXQ-w@2x.jpeg","originalWidth":3000,"originalHeight":1997},"name":"Android Dev","description":"Building little green robots.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Android Development: Articles and News — Medium","type":"Topic"},{"topicId":"decb52b64abf","slug":"programming","createdAt":1493934116328,"deletedAt":0,"image":{"id":"1*iPa136b1cGEO7lvoXg6uHQ@2x.jpeg","originalWidth":6016,"originalHeight":4016},"name":"Programming","description":"The good, the bad, the buggy.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Programming News and Articles — Medium","type":"Topic"}]},"coverless":true,"slug":"how-to-use-koin-scopes-with-decompose-components","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":true,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"how-to-use-koin-scopes-with-decompose-components-14d04ea18e1a","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"0*eru2Zt27h8fGOHgx","originalWidth":1024,"originalHeight":1024,"isFeatured":true}},{"name":"43ea","type":3,"text":"How to use Koin scopes with Decompose components?","markups":[],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"In this article I’d like to share the approach of how I resolved the issue with the registration of the big amount of named dependencies by…"},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"c72404660798","isNewsletter":false,"newsletterId":"","webCanonicalUrl":"","mediumUrl":"","migrationId":"","notifyFollowers":true,"notifyTwitter":false,"notifyFacebook":false,"responseHiddenOnParentPostAt":0,"isSeries":false,"isSubscriptionLocked":false,"seriesLastAppendedAt":0,"audioVersionDurationSec":0,"sequenceId":"","isEligibleForRevenue":false,"isBlockedFromHightower":false,"deletedAt":0,"lockedPostSource":0,"hightowerMinimumGuaranteeStartsAt":0,"hightowerMinimumGuaranteeEndsAt":0,"featureLockRequestAcceptedAt":0,"mongerRequestType":1,"layerCake":6,"socialTitle":"","socialDek":"","editorialPreviewTitle":"","editorialPreviewDek":"","curationEligibleAt":0,"isProxyPost":false,"proxyPostFaviconUrl":"","proxyPostProviderName":"","proxyPostType":0,"isSuspended":false,"isLimitedState":false,"seoTitle":"","previewContent2":{"bodyModel":{"paragraphs":[{"name":"43ea","type":3,"text":"How to use Koin scopes with Decompose components?","markups":[]},{"name":"05f5","type":4,"text":"Image generated by ChatGPT","markups":[],"layout":1,"metadata":{"id":"0*eru2Zt27h8fGOHgx","originalWidth":1024,"originalHeight":1024,"isFeatured":true}},{"name":"ebe7","type":1,"text":"In this article I’d like to share the approach of how I resolved the issue with the registration of the big amount of named dependencies by using scopes in Koin. Let me show the problem at the beginning. We have two components that represent whole screens — list screen component…","markups":[]}],"sections":[{"name":"a37d","startIndex":0}]},"isFullContent":false,"subtitle":"In this article I’d like to share the approach of how I resolved the issue with the registration of the big amount of named dependencies by…"},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":false,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"},"0f621bfd06a0":{"id":"0f621bfd06a0","versionId":"0e52a39e2ad0","creatorId":"9bb203a4ab2e","homeCollectionId":"c72404660798","title":"Loading Initial Data on Android Part 2: Clear All Your Doubts","detectedLanguage":"en","latestVersion":"0e52a39e2ad0","latestPublishedVersion":"0e52a39e2ad0","hasUnpublishedEdits":false,"latestRev":1749,"createdAt":1726737055130,"updatedAt":1731748747397,"acceptedAt":0,"firstPublishedAt":1726839276468,"latestPublishedAt":1727080043089,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"When a user enters a screen, the default data should be fetched by triggering the business logic, whether from the network or local…","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"1*GQIpQqipXEDa1RQm05B4Ig.jpeg","filter":"","backgroundSize":"","originalWidth":3000,"originalHeight":2000,"strategy":"resample","height":0,"width":0},"wordCount":1757,"imageCount":5,"readingTime":7.463522012578616,"subtitle":"When a user enters a screen, the default data should be fetched by triggering the business logic, whether from the network or local…","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":111,"isBookmarked":false,"tags":[{"slug":"android","name":"Android","postCount":143707,"metadata":{"postCount":143707,"coverImage":{"id":"1*bPrF2ZemLaRrMYCmvLmWMQ.png","originalWidth":2560,"originalHeight":1280,"isFeatured":true}},"type":"Tag"},{"slug":"kotlin","name":"Kotlin","postCount":30983,"metadata":{"postCount":30983,"coverImage":{"id":"1*XeP3JED3Ubhmccah7E6hYg.jpeg","originalWidth":1376,"originalHeight":768,"isFeatured":true}},"type":"Tag"},{"slug":"jetpack","name":"Jetpack","postCount":1444,"metadata":{"postCount":1444,"coverImage":{"id":"1*ykPIAcpLN3vaghlbIH2Trw.jpeg","originalWidth":1100,"originalHeight":617}},"type":"Tag"},{"slug":"compose","name":"Compose","postCount":1022,"metadata":{"postCount":1022,"coverImage":{"id":"1*N1FN_sHMBc8scFfMJgGIIQ.png","originalWidth":1792,"originalHeight":1024,"isFeatured":true}},"type":"Tag"},{"slug":"jetpack-compose","name":"Jetpack Compose","postCount":6081,"metadata":{"postCount":6081,"coverImage":{"id":"1*bPrF2ZemLaRrMYCmvLmWMQ.png","originalWidth":2560,"originalHeight":1280,"isFeatured":true}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":7,"links":{"entries":[{"url":"https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:navigation/navigation-common/src/main/java/androidx/navigation/NavBackStackEntry.kt;l=122?q=defaultViewModelProviderFactory&start=21","alts":[],"httpStatus":200},{"url":"https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:lifecycle/lifecycle-viewmodel-savedstate/src/androidMain/kotlin/androidx/lifecycle/SavedStateViewModelFactory.android.kt;l=42?q=SavedStateViewModelFactory&sq=","alts":[],"httpStatus":200},{"url":"https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:hilt/hilt-navigation/src/main/java/androidx/hilt/navigation/HiltNavBackStackEntry.kt;l=43?q=navBackStackEntry.defaultViewModelProviderFactory","alts":[],"httpStatus":200},{"url":"https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:navigation/navigation-compose/src/main/java/androidx/navigation/compose/NavHost.kt;l=551?q=visibleEntries.lastOrNull()","alts":[],"httpStatus":200},{"url":"https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:navigation/navigation-common/src/main/java/androidx/navigation/NavBackStackEntry.kt;l=74?q=NavBackStackEntry","alts":[],"httpStatus":200},{"url":"https://dagger.dev/hilt/view-model","alts":[],"httpStatus":200},{"url":"https://dagger.dev/api/latest/dagger/hilt/android/ViewModelLifecycle.html","alts":[],"httpStatus":200},{"url":"https://github.com/doveletter","alts":[],"httpStatus":200},{"url":"https://developer.android.com/develop/ui/compose/mental-model#parallel","alts":[],"httpStatus":200},{"url":"https://github.com/skydoves/pokedex-compose","alts":[],"httpStatus":200},{"url":"https://github.com/google/dagger/blob/5f761866468cc7ba9fd6047ad5b1a93d62e9a919/java/dagger/hilt/android/internal/lifecycle/HiltViewModelFactory.java#L100","alts":[],"httpStatus":200},{"url":"https://github.com/google/dagger/blob/5f761866468cc7ba9fd6047ad5b1a93d62e9a919/java/dagger/hilt/android/internal/builders/ViewModelComponentBuilder.java#L27","alts":[],"httpStatus":200},{"url":"https://medium.com/@der.x/restartable-stateflows-in-compose-46316ce670a9","alts":[{"type":3,"url":"medium://p/46316ce670a9"},{"type":2,"url":"medium://p/46316ce670a9"}],"httpStatus":200},{"url":"https://github.com/skydoves","alts":[],"httpStatus":200},{"url":"https://developer.android.com/topic/libraries/architecture/viewmodel/viewmodel-savedstate","alts":[],"httpStatus":200},{"url":"https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-mutable-state-flow/","alts":[],"httpStatus":200},{"url":"https://youtu.be/8m1W4PyYMYQ?feature=shared","alts":[],"httpStatus":200},{"url":"https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/map-latest.html","alts":[],"httpStatus":200},{"url":"https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-sharing-started/","alts":[],"httpStatus":200},{"url":"https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/flat-map-latest.html","alts":[],"httpStatus":200},{"url":"https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-state-flow/","alts":[],"httpStatus":200},{"url":"https://medium.com/@skydoves/learn-kotlin-and-android-with-dove-letter-26265da11903","alts":[{"type":3,"url":"medium://p/26265da11903"},{"type":2,"url":"medium://p/26265da11903"}],"httpStatus":200},{"url":"https://kotlinlang.org/docs/flow.html","alts":[],"httpStatus":200},{"url":"https://developer.android.com/develop/ui/compose/navigation","alts":[],"httpStatus":200},{"url":"https://developer.android.com/reference/kotlin/androidx/lifecycle/compose/package-summary#extension-functions","alts":[],"httpStatus":200},{"url":"https://medium.com/proandroiddev/loading-initial-data-in-launchedeffect-vs-viewmodel-f1747c20ce62","alts":[{"type":3,"url":"medium://p/f1747c20ce62"},{"type":2,"url":"medium://p/f1747c20ce62"}],"httpStatus":200}],"version":"0.3","generatedAt":1727080044557},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":624,"sectionCount":1,"readingList":0,"topics":[{"topicId":"64756708407c","slug":"android-development","createdAt":1521652914155,"deletedAt":0,"image":{"id":"1*zLD64ewnrZ3XKBtDUMXQ-w@2x.jpeg","originalWidth":3000,"originalHeight":1997},"name":"Android Dev","description":"Building little green robots.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Android Development: Articles and News — Medium","type":"Topic"}]},"coverless":true,"slug":"loading-initial-data-part-2-clear-all-your-doubts","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":true,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"loading-initial-data-part-2-clear-all-your-doubts-0f621bfd06a0","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"1*GQIpQqipXEDa1RQm05B4Ig.jpeg","originalWidth":3000,"originalHeight":2000,"isFeatured":true}},{"name":"d1db","type":3,"text":"Loading Initial Data on Android Part 2: Clear All Your Doubts","markups":[],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"When a user enters a screen, the default data should be fetched by triggering the business logic, whether from the network or local…"},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"c72404660798","isNewsletter":false,"newsletterId":"b3a2bf2314ab","webCanonicalUrl":"","mediumUrl":"","migrationId":"","notifyFollowers":true,"notifyTwitter":false,"notifyFacebook":false,"responseHiddenOnParentPostAt":0,"isSeries":false,"isSubscriptionLocked":false,"seriesLastAppendedAt":0,"audioVersionDurationSec":0,"sequenceId":"","isEligibleForRevenue":false,"isBlockedFromHightower":false,"deletedAt":0,"lockedPostSource":0,"hightowerMinimumGuaranteeStartsAt":0,"hightowerMinimumGuaranteeEndsAt":0,"featureLockRequestAcceptedAt":0,"mongerRequestType":1,"layerCake":6,"socialTitle":"","socialDek":"","editorialPreviewTitle":"","editorialPreviewDek":"","curationEligibleAt":0,"isProxyPost":false,"proxyPostFaviconUrl":"","proxyPostProviderName":"","proxyPostType":0,"isSuspended":false,"isLimitedState":false,"seoTitle":"","previewContent2":{"bodyModel":{"paragraphs":[{"name":"6f1d","type":4,"text":"Unsplash@anniespratt","markups":[],"layout":1,"metadata":{"id":"1*GQIpQqipXEDa1RQm05B4Ig.jpeg","originalWidth":3000,"originalHeight":2000,"isFeatured":true}},{"name":"d1db","type":3,"text":"Loading Initial Data on Android Part 2: Clear All Your Doubts","markups":[]},{"name":"3de5","type":1,"text":"When a user enters a screen, the default data should be fetched by triggering the business logic, whether from the network or local database. It’s essential to select the right trigger point to avoid side effects, while also preserving the data as state to handle configuration changes in Android.","markups":[],"hasDropCap":true},{"name":"0118","type":1,"text":"We’ve…","markups":[{"type":10,"start":113,"end":127},{"type":10,"start":131,"end":140},{"type":3,"start":161,"end":213,"href":"https://medium.com/proandroiddev/loading-initial-data-in-launchedeffect-vs-viewmodel-f1747c20ce62","title":"","rel":"","anchorType":0},{"type":3,"start":376,"end":380,"href":"https://kotlinlang.org/docs/flow.html","title":"","rel":"","anchorType":0},{"type":2,"start":160,"end":216}]}],"sections":[{"name":"91e5","startIndex":0}]},"isFullContent":false,"subtitle":"When a user enters a screen, the default data should be fetched by triggering the business logic, whether from the network or local…"},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":true,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"}}},"paging":{"path":"/_/api/collections/c72404660798/stream","next":{"to":"1731738465538","ignoredIds":["187d5e14d212","05e8fe2acd2c","12f6a9939053","14d04ec2426a","138d3496c624","07ca74eee000","08927e4d2855","14d04ea18e1a","0f621bfd06a0"],"page":3}},"collection":{"id":"c72404660798","name":"ProAndroidDev","slug":"proandroiddev","tags":[],"creatorId":"c6e8e225f7d5","description":"The latest posts from Android Professionals and Google Developer Experts.","shortDescription":"The latest posts from Android Professionals and Google…","image":{"imageId":"1*XVtdl45m8YaYrPI4buJ5yQ.png","filter":"","backgroundSize":"","originalWidth":1000,"originalHeight":1000,"strategy":"resample","height":0,"width":0},"metadata":{"followerCount":62208,"activeAt":1732674772273},"virtuals":{"permissions":{"canPublish":false,"canPublishAll":false,"canRepublish":false,"canRemove":false,"canManageAll":false,"canSubmit":false,"canEditPosts":false,"canAddWriters":false,"canViewStats":false,"canSendNewsletter":false,"canViewLockedPosts":false,"canViewCloaked":false,"canEditOwnPosts":false,"canBeAssignedAuthor":false,"canEnrollInHightower":false,"canLockPostsForMediumMembers":false,"canLockOwnPostsForMediumMembers":false,"canViewNewsletterV2Stats":false,"canCreateNewsletterV3":false},"isSubscribed":false,"isEnrolledInHightower":false,"isEligibleForHightower":false,"isSubscribedToCollectionEmails":false,"isMuted":false,"canToggleEmail":false,"isWriter":false},"logo":{"imageId":"","filter":"","backgroundSize":"","originalWidth":0,"originalHeight":0,"strategy":"resample","height":0,"width":0},"twitterUsername":"proandroiddev","facebookPageName":"proandroiddev","publicEmail":"editors@proandroiddev.com","domain":"proandroiddev.com","sections":[{"type":2,"collectionHeaderMetadata":{"backgroundImage":{"id":"1*i5UmD6poC0MpEw0UlnWhTQ.png","originalWidth":2000,"originalHeight":250},"logoImage":{"id":"1*V45--ieyNysokCIUqFXTKw@2x.png","originalWidth":1,"originalHeight":2,"alt":"ProAndroidDev"},"alignment":2,"layout":5}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":7,"postIds":["ff7bb40470df","517909777921","38c8cd5dc16c","2565bb90fef8","a950e6f9eb72","2dcc4db2f76c","aa0760383569"]}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":9,"postIds":["187d5e14d212","05e8fe2acd2c","12f6a9939053","14d04ec2426a","138d3496c624","07ca74eee000","08927e4d2855","14d04ea18e1a","0f621bfd06a0"],"sectionHeader":"Trending Blogs"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"38769d69f98a"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[],"sectionHeader":"Latest"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[],"sectionHeader":"Latest"}}],"tintColor":"#FF7DE1C3","lightText":false,"favicon":{"imageId":"1*A8VytPZQhvUf_MG6hm_Dlw.png","filter":"","backgroundSize":"","originalWidth":128,"originalHeight":128,"strategy":"resample","height":0,"width":0},"colorPalette":{"defaultBackgroundSpectrum":{"colorPoints":[{"color":"#FF2E987E","point":0},{"color":"#FF318D75","point":0.1},{"color":"#FF32826C","point":0.2},{"color":"#FF327663","point":0.3},{"color":"#FF306B5A","point":0.4},{"color":"#FF2E5F50","point":0.5},{"color":"#FF2A5347","point":0.6},{"color":"#FF26463C","point":0.7},{"color":"#FF203931","point":0.8},{"color":"#FF192C25","point":0.9},{"color":"#FF101D19","point":1}],"backgroundColor":"#FFFFFFFF"},"tintBackgroundSpectrum":{"colorPoints":[{"color":"#FF7DE1C3","point":0},{"color":"#FF6ED2B5","point":0.1},{"color":"#FF5EC3A6","point":0.2},{"color":"#FF4EB397","point":0.3},{"color":"#FF3CA388","point":0.4},{"color":"#FF269278","point":0.5},{"color":"#FF008168","point":0.6},{"color":"#FF006F57","point":0.7},{"color":"#FF005C45","point":0.8},{"color":"#FF004732","point":0.9},{"color":"#FF002F1C","point":1}],"backgroundColor":"#FF7DE1C3"},"highlightSpectrum":{"colorPoints":[{"color":"#FFE4F8EF","point":0},{"color":"#FFDEF8ED","point":0.1},{"color":"#FFD9F7EB","point":0.2},{"color":"#FFD3F6E9","point":0.3},{"color":"#FFCEF6E7","point":0.4},{"color":"#FFC8F5E4","point":0.5},{"color":"#FFC2F4E2","point":0.6},{"color":"#FFBCF4E0","point":0.7},{"color":"#FFB5F3DE","point":0.8},{"color":"#FFAFF2DB","point":0.9},{"color":"#FFA8F2D9","point":1}],"backgroundColor":"#FFFFFFFF"},"darkBackgroundSpectrum":{"colorPoints":[{"color":"#FF4CB196","point":0},{"color":"#FF60B99F","point":0.1},{"color":"#FF72C0A7","point":0.2},{"color":"#FF82C7B0","point":0.3},{"color":"#FF91CDB9","point":0.4},{"color":"#FFA0D4C2","point":0.5},{"color":"#FFAEDACA","point":0.6},{"color":"#FFBCE1D3","point":0.7},{"color":"#FFC9E7DB","point":0.8},{"color":"#FFD6EDE3","point":0.9},{"color":"#FFE3F3EC","point":1}],"backgroundColor":"#FF000000"}},"navItems":[{"type":2,"title":"Submit","postId":"b2efa7f46272","url":"https://proandroiddev.com/submission-guidelines-b2efa7f46272","source":"postId"},{"type":5,"title":"Archive","url":"https://proandroiddev.com/archive"},{"type":6,"title":"About","url":"https://proandroiddev.com/about"},{"type":3,"title":"droidcon Academy","url":"https://academy.droidcon.com"}],"colorBehavior":2,"collectionFeatures":[30],"ampLogo":{"imageId":"","filter":"","backgroundSize":"","originalWidth":0,"originalHeight":0,"strategy":"resample","height":0,"width":0},"header":{"backgroundImage":{"id":"1*i5UmD6poC0MpEw0UlnWhTQ.png","originalWidth":2000,"originalHeight":250},"logoImage":{"id":"1*V45--ieyNysokCIUqFXTKw@2x.png","originalWidth":1,"originalHeight":2,"alt":"ProAndroidDev"},"alignment":2,"layout":5},"paidForDomainAt":1497851443187,"subscriberCount":62208,"tagline":"The latest posts from Android Professionals and Google Developer Experts","isOptedIntoAurora":false,"newsletterV3":{"newsletterV3Id":"278dceec521d","type":1,"name":"ProAndroidDev Digest","description":"Get updates on latest posts on ProAndroidDev and never miss a hot story! ","collectionId":"c72404660798","newsletterSlug":"proandroiddev-digest","isSubscribed":false,"showPromo":false,"avatarImageId":"","creatorId":"6c67343165e2","showNewsletterPostsInCollectionHome":false,"exportableSubscribersCount":2035,"subscribersCount":12158,"promoHeadline":"","promoBody":"","replyToEmail":""},"isCurationAllowedByDefault":false,"polarisCoverImage":{"imageId":"","filter":"","backgroundSize":"","originalWidth":0,"originalHeight":0,"strategy":"resample","height":0,"width":0},"ptsQualifiedAt":1616092782276,"type":"Collection"},"header":{"backgroundImage":{"id":"1*i5UmD6poC0MpEw0UlnWhTQ.png","originalWidth":2000,"originalHeight":250},"logoImage":{"id":"1*V45--ieyNysokCIUqFXTKw@2x.png","originalWidth":1,"originalHeight":2,"alt":"ProAndroidDev"},"alignment":2,"layout":5},"streamItems":[{"createdAt":1732718279336,"randomId":"deb79d07130e","section":{"items":[{"post":{"postId":"ff7bb40470df"},"itemType":"post"},{"post":{"postId":"517909777921"},"itemType":"post"},{"post":{"postId":"38c8cd5dc16c"},"itemType":"post"},{"post":{"postId":"2565bb90fef8"},"itemType":"post"},{"post":{"postId":"a950e6f9eb72"},"itemType":"post"},{"post":{"postId":"2dcc4db2f76c"},"itemType":"post"},{"post":{"postId":"aa0760383569"},"itemType":"post"}],"layout":4},"itemType":"section","type":"StreamItem"},{"createdAt":1732718279336,"randomId":"b987d8465bb1","section":{"items":[{"post":{"postId":"187d5e14d212"},"itemType":"post"},{"post":{"postId":"05e8fe2acd2c"},"itemType":"post"},{"post":{"postId":"12f6a9939053"},"itemType":"post"},{"post":{"postId":"14d04ec2426a"},"itemType":"post"},{"post":{"postId":"138d3496c624"},"itemType":"post"},{"post":{"postId":"07ca74eee000"},"itemType":"post"},{"post":{"postId":"08927e4d2855"},"itemType":"post"},{"post":{"postId":"14d04ea18e1a"},"itemType":"post"},{"post":{"postId":"0f621bfd06a0"},"itemType":"post"}],"layout":4,"heading":{"fallbackTitle":"Trending Blogs","headingBasic":{"title":"Trending Blogs"},"headingType":"headingBasic"}},"itemType":"section","type":"StreamItem"}]}) // ]]></script></body></html>

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