{"id":2818,"date":"2016-05-20T20:34:56","date_gmt":"2016-05-20T20:34:56","guid":{"rendered":"http:\/\/www.ckl.io\/?p=2818"},"modified":"2022-07-01T17:57:16","modified_gmt":"2022-07-01T17:57:16","slug":"how-to-address-common-android-problems","status":"publish","type":"post","link":"https:\/\/cheesecakelabs.com\/blog\/how-to-address-common-android-problems\/","title":{"rendered":"You don&#8217;t need to code it: how I address common Android problems"},"content":{"rendered":"<p>Android is an awesome platform that enables you to impact millions of users, but, even after so many years in the market, there are still several basic problems that are still a pain to solve and haven&#8217;t been included in Android&#8217;s core Software Development Kit.<\/p>\n<p><span style=\"line-height: 1.5;\">In order to solve these key problems,<\/span><span style=\"line-height: 1.5;\"> I&#8217;ll point some great tools and libraries \u2013 developed by the Android community \u2013 that <\/span>are<span style=\"line-height: 1.5;\"> widely used&nbsp;and a breeze to work with.&nbsp;They<\/span>&nbsp; are all open source, available on <a href=\"http:\/\/www.github.com\">GitHub<\/a>&nbsp;and actively maintained. Now, let&#8217;s start!<\/p>\n<p><!--more--><\/p>\n<h2><img decoding=\"async\" class=\"size-full wp-image-2850 aligncenter\" src=\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2016\/05\/come-with-me.gif\" alt=\"Come with me\" width=\"500\" height=\"280\">1. Communicating with&nbsp;REST APIs<\/h2>\n<p>Nowadays most of our apps are connected to the Internet and exchanging data with <a style=\"font-size: 16px; line-height: 1.5;\" href=\"https:\/\/en.wikipedia.org\/wiki\/Representational_state_transfer\">REST APIs<\/a>. Now Android doesn&#8217;t have a method set in stone, but their suggestion to do this makes me shiver. It suggests using <a href=\"https:\/\/developer.android.com\/reference\/android\/os\/AsyncTask.html\">AsyncTasks<\/a>, HTTP objects and parsing the response. No way!<a href=\"https:\/\/giphy.com\/gifs\/parks-and-rec-ron-swanson-utah-NzWKrLIRwm8jm\"><br \/>\n<\/a><\/p>\n<p>Fear&nbsp;not, young&nbsp;padawan \u2013 that&#8217;s why I&#8217;m writing this post. If you have been an Android Developer for a year or more, you have most likely heard or used <a href=\"http:\/\/square.github.io\/retrofit\/\">Retrofit<\/a>. But if you haven&#8217;t,&nbsp;stay a while and listen: Retrofit is a library that helps you communicate with a REST API in a clean and organized way.<\/p>\n<p>The value of Retrofit lies in how it enables you&nbsp;to describe your endpoints as interface methods. These methods are all you have to worry about when defining your endpoints and HTTP verbs &#8212; whether they are&nbsp;GETs, POSTs and so on. Here&#8217;s an example (yeah, it&#8217;s that simple!):<\/p>\n<pre><code class=\"language-java\">\n@Headers(\"Content-Type:application\/json\")\n@GET(\"v1\/model\/{id}\")\nObservable getModelFromServer(@Header(\"Authorization\") String userKey, @Path(\"id\") long modelId);\n<\/code><\/pre>\n<p>Retrofit is very easy to attach to your project, has a low footprint in your app and its learning curve is very low. When combined with tools like <a href=\"https:\/\/apiary.io\/\">Apiary,<\/a>&nbsp;a well-documented RESTful API (and maybe&nbsp;<a href=\"https:\/\/github.com\/ReactiveX\/RxAndroid\">RxAndroid<\/a>?) you can take care of your network assignments in a very short time. Of course, Retrofit isn&#8217;t the only option out there &#8212; but I urge you to try it if you haven&#8217;t. You won&#8217;t regret.<\/p>\n<h2>2. Custom Fonts<\/h2>\n<p>The first time&nbsp;I received a design with unconventional fonts used all over the app, I expected that all I needed to do was import the font file to the project and use a magical XML attribute that would enable the custom font. But then the reality hit me in the face: that magical attribute doesn&#8217;t&nbsp;exist.<\/p>\n<p>After thinking a bit, I came with 2 options on how to apply that custom font:<\/p>\n<ol>\n<li>Setting it programmatically&nbsp;on each view &#8212; choosing this option forced me to call each view separately&nbsp;and define its font, which generated a lot of duplicates in my code (or forced me to end up using a Helper method all over the app);<\/li>\n<li>Creating a custom View and defining the magic attribute I&nbsp;expected it to have. Ok, this sounds like a good solution, but hum&#8230;<\/li>\n<\/ol>\n<p><img decoding=\"async\" class=\"wp-image-2829 aligncenter\" src=\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2016\/05\/nope.gif\" alt=\"Nope\" width=\"366\" height=\"206\"><\/p>\n<p>Now, what if the design mockups included custom fonts in all components? Which option would you go with? What about a third option? <a href=\"https:\/\/github.com\/chrisjenx\/Calligraphy\">Calligraphy<\/a>!<\/p>\n<p>Calligraphy does what I expected Android to&nbsp;have implemented by default. It allows you to define a custom font as your app&#8217;s default and provides that magical attribute to every view! Now&nbsp;this seems like the right way to go!<\/p>\n<p>It&#8217;s very easy to use Calligraphy in your project, you just need to enable it using your Application and overriding the method <a href=\"https:\/\/developer.android.com\/reference\/android\/content\/ContextWrapper.html#attachBaseContext(android.content.Context)\">attachBaseContext<\/a>&nbsp;in your Activity (I suggest using a BaseActivity for your project).<\/p>\n<pre><code class=\"language-java\">\n\/\/ Inside your Application\n\nprivate void setDefaultFont() {\n    CalligraphyConfig.initDefault(new CalligraphyConfig.Builder()\n            .setDefaultFontPath(getString(R.string.roboto_regular))\n            .setFontAttrId(R.attr.fontPath)\n            .build());\n}\n\n\/\/ And on your Activity\n\n@Override\nprotected void attachBaseContext(Context newBase) {\n    \/\/ Attaches Calligraphy to the Activity\n    super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));\n}\n<\/code><\/pre>\n<p>That&#8217;s it! Next task!<\/p>\n<h2>3. Image Caching<\/h2>\n<p>Images! As we all know, an image is worth a thousand words &#8212; and that is true for software development as well: an image is worth a whole lot of <del>strings<\/del>&nbsp;words! Nowadays our apps make use of a lot of images that are dynamically retrieved from an external source, and this forces us to download them, parse them, and who knows&#8230; save it on memory?<\/p>\n<p>To decrease the number of times we need to retrieve it through our requests (and prevent OutOfMemoryExceptions) we should take advantage of image caching. Obviously, Android has a bunch of features that enable you to implement your Image Caching logic &#8212; but as with this article I want to point you on how to overcome these hindrances quickly, I&#8217;ll present a great option.<br \/>\n<img decoding=\"async\" class=\"size-full wp-image-2847 aligncenter\" src=\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2016\/05\/alladin_trust_me.gif\" alt=\"Alladin - Trust me\" width=\"500\" height=\"209\"><br \/>\n<a href=\"https:\/\/github.com\/bumptech\/glide\">Glide<\/a> has a very straightforward usage: all you need to do is inform the target ImageView and the URL from where to fetch. Glide will do its magic and define whether it should fetch the image for that particular URL or use the cached version. But it doesn&#8217;t stop there: you can also define a placeholder for when your image is still loading, an error image for better UX when the fetch goes wrong, and also&#8230; wait for it&#8230; there&#8217;s GIF support!<\/p>\n<p>If you have heard or used <a href=\"http:\/\/square.github.io\/picasso\/\">Picasso<\/a>, you must probably be thinking that Glide is a Picasso rip-off, but their&nbsp;similarities are only in syntax: Glide has some under-the-hood modifications for better performance and optimal memory usage.<\/p>\n<h2>4. Databases<\/h2>\n<p>We can all agree that <a href=\"https:\/\/developer.android.com\/training\/basics\/data-storage\/databases.html\">Database<\/a> on Android is a pain &#8212; having to implement the <a href=\"https:\/\/developer.android.com\/reference\/android\/database\/sqlite\/SQLiteOpenHelper.html\">SQLiteOpenHelper<\/a>, writing <a href=\"https:\/\/en.wikipedia.org\/wiki\/SQL\">SQL<\/a> queries and all the bureaucracy that comes with it. Don&#8217;t misread me, it&#8217;s good to know all about that &#8212; but sometimes it&#8217;s a smarter choice going with a more direct approach like <a href=\"https:\/\/realm.io\/\">Realm<\/a>, <a href=\"https:\/\/github.com\/requery\/requery\">Requery<\/a>&nbsp;or <a href=\"https:\/\/github.com\/Raizlabs\/DBFlow\">DBFlow<\/a>.<\/p>\n<p>You might have noticed that I didn&#8217;t point you to a specific library, but there&#8217;s an explanation: I still don&#8217;t have a personal favorite. All three of them are widely used by developers, and articles comparing and talking about them are widely spread on the Internet.<\/p>\n<ul>\n<li>DBFlow makes use of the annotation processor, which enables you to annotate your model classes defining tables and columns. Querying your data using DBFlow is really simple making use of the <a href=\"https:\/\/en.wikipedia.org\/wiki\/Builder_pattern\">Builder Pattern<\/a> for creating the query.<\/li>\n<li>Requery also makes use of the annotation processor for creating the database based on the models. But what makes it stand from the others is its support for Java 8 <a href=\"http:\/\/www.oracle.com\/technetwork\/articles\/java\/ma14-java-se-8-streams-2177646.html\">streams<\/a> and RxJava&#8217;s <a href=\"https:\/\/github.com\/ReactiveX\/RxJava\/wiki\/Observable\">Observables<\/a>. Requery is relatively new but has been turning lots of heads towards it for its features.<\/li>\n<li>While Requery and DBFlow build an Object-Relational Mapping (ORM)&nbsp;on top of the SQLite of Android, Realm went beyond it and developed its own multi-platform database (supporting iOS, Javascript and Android). For your models, you must extend a RealmObject available in the library, this object makes available the CRUD methods for the model. As a plus, Realm have available a browser for reading the created database binary (.realm).<\/li>\n<\/ul>\n<p>All three of them are great, but&nbsp;if you must know &#8212; right now I would go with Requery as my next project&#8217;s database, as&nbsp;I have been using RxJava a lot in my projects.<\/p>\n<h2>Wrapping Up<\/h2>\n<p>I hope this post sheds a light on a couple of easy solutions for problems you&#8217;ll encounter in most of the Android apps you&#8217;ll build.&nbsp;Please, share your experience with these libs and any other you think are awesome in the comments section!<\/p>\n<p><img decoding=\"async\" class=\"wp-image-2863 aligncenter\" src=\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2016\/05\/seeyou.gif\" alt=\"See you\" width=\"373\" height=\"159\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Android is an awesome platform that enables you to impact millions of users, but, even after so many years in the market, there are still several basic problems that are still a pain to solve and haven&#8217;t been included in Android&#8217;s core Software Development Kit. In order to solve these key problems, I&#8217;ll point some [&hellip;]<\/p>\n","protected":false},"author":65,"featured_media":2935,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[432,7],"tags":[],"class_list":["post-2818","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-engineering","category-opinion"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.1.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>You don&#039;t need to code it: how I address common Android problems<\/title>\n<meta name=\"description\" content=\"How to solve typography, RESTful, databases and image caching problems on Android development using widely adopted libraries.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/cheesecakelabs.com\/blog\/how-to-address-common-android-problems\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"You don&#039;t need to code it: how I address common Android problems\" \/>\n<meta property=\"og:description\" content=\"How to solve typography, RESTful, databases and image caching problems on Android development using widely adopted libraries.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cheesecakelabs.com\/blog\/how-to-address-common-android-problems\/\" \/>\n<meta property=\"og:site_name\" content=\"Cheesecake Labs\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/cheesecakelabs\" \/>\n<meta property=\"article:published_time\" content=\"2016-05-20T20:34:56+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-07-01T17:57:16+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2016\/05\/androidlibrary3.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2076\" \/>\n\t<meta property=\"og:image:height\" content=\"720\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Cheesecake Labs\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@cheesecakelabs\" \/>\n<meta name=\"twitter:site\" content=\"@cheesecakelabs\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/how-to-address-common-android-problems\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/how-to-address-common-android-problems\/\"},\"author\":{\"name\":\"Leonardo Farage\"},\"headline\":\"You don&#8217;t need to code it: how I address common Android problems\",\"datePublished\":\"2016-05-20T20:34:56+00:00\",\"dateModified\":\"2022-07-01T17:57:16+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/how-to-address-common-android-problems\/\"},\"wordCount\":1216,\"commentCount\":0,\"image\":{\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/how-to-address-common-android-problems\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2016\/05\/androidlibrary3.jpg\",\"articleSection\":[\"Engineering\",\"Opinion\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/cheesecakelabs.com\/blog\/how-to-address-common-android-problems\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/how-to-address-common-android-problems\/\",\"url\":\"https:\/\/cheesecakelabs.com\/blog\/how-to-address-common-android-problems\/\",\"name\":\"You don't need to code it: how I address common Android problems\",\"isPartOf\":{\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/how-to-address-common-android-problems\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/how-to-address-common-android-problems\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2016\/05\/androidlibrary3.jpg\",\"datePublished\":\"2016-05-20T20:34:56+00:00\",\"dateModified\":\"2022-07-01T17:57:16+00:00\",\"author\":{\"@type\":\"person\",\"name\":\"Leonardo Farage\"},\"description\":\"How to solve typography, RESTful, databases and image caching problems on Android development using widely adopted libraries.\",\"breadcrumb\":{\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/how-to-address-common-android-problems\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cheesecakelabs.com\/blog\/how-to-address-common-android-problems\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/how-to-address-common-android-problems\/#primaryimage\",\"url\":\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2016\/05\/androidlibrary3.jpg\",\"contentUrl\":\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2016\/05\/androidlibrary3.jpg\",\"width\":2076,\"height\":720},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/how-to-address-common-android-problems\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cheesecakelabs.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"You don&#8217;t need to code it: how I address common Android problems\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/#website\",\"url\":\"https:\/\/cheesecakelabs.com\/blog\/\",\"name\":\"Cheesecake Labs\",\"description\":\"Nearshore outsourcing company for Web and Mobile design and engineering services, and staff augmentation for startups and enterprises..\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/cheesecakelabs.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"name\":\"Leonardo Farage\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/#\/schema\/person\/image\/\",\"url\":false,\"contentUrl\":false,\"caption\":\"Leonardo Farage\"},\"description\":\"10 years of experience in Marketing and Sales in the Technology sector. My main purpose is help, support and structure efficient operations and also develop independent and multidisciplinary teams.\",\"url\":\"https:\/\/cheesecakelabs.com\/blog\/autor\/leonardo-2\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"You don't need to code it: how I address common Android problems","description":"How to solve typography, RESTful, databases and image caching problems on Android development using widely adopted libraries.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/cheesecakelabs.com\/blog\/how-to-address-common-android-problems\/","og_locale":"en_US","og_type":"article","og_title":"You don't need to code it: how I address common Android problems","og_description":"How to solve typography, RESTful, databases and image caching problems on Android development using widely adopted libraries.","og_url":"https:\/\/cheesecakelabs.com\/blog\/how-to-address-common-android-problems\/","og_site_name":"Cheesecake Labs","article_publisher":"https:\/\/www.facebook.com\/cheesecakelabs","article_published_time":"2016-05-20T20:34:56+00:00","article_modified_time":"2022-07-01T17:57:16+00:00","og_image":[{"width":2076,"height":720,"url":"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2016\/05\/androidlibrary3.jpg","type":"image\/jpeg"}],"author":"Cheesecake Labs","twitter_card":"summary_large_image","twitter_creator":"@cheesecakelabs","twitter_site":"@cheesecakelabs","twitter_misc":{"Written by":null,"Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/cheesecakelabs.com\/blog\/how-to-address-common-android-problems\/#article","isPartOf":{"@id":"https:\/\/cheesecakelabs.com\/blog\/how-to-address-common-android-problems\/"},"author":{"name":"Leonardo Farage"},"headline":"You don&#8217;t need to code it: how I address common Android problems","datePublished":"2016-05-20T20:34:56+00:00","dateModified":"2022-07-01T17:57:16+00:00","mainEntityOfPage":{"@id":"https:\/\/cheesecakelabs.com\/blog\/how-to-address-common-android-problems\/"},"wordCount":1216,"commentCount":0,"image":{"@id":"https:\/\/cheesecakelabs.com\/blog\/how-to-address-common-android-problems\/#primaryimage"},"thumbnailUrl":"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2016\/05\/androidlibrary3.jpg","articleSection":["Engineering","Opinion"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/cheesecakelabs.com\/blog\/how-to-address-common-android-problems\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/cheesecakelabs.com\/blog\/how-to-address-common-android-problems\/","url":"https:\/\/cheesecakelabs.com\/blog\/how-to-address-common-android-problems\/","name":"You don't need to code it: how I address common Android problems","isPartOf":{"@id":"https:\/\/cheesecakelabs.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cheesecakelabs.com\/blog\/how-to-address-common-android-problems\/#primaryimage"},"image":{"@id":"https:\/\/cheesecakelabs.com\/blog\/how-to-address-common-android-problems\/#primaryimage"},"thumbnailUrl":"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2016\/05\/androidlibrary3.jpg","datePublished":"2016-05-20T20:34:56+00:00","dateModified":"2022-07-01T17:57:16+00:00","author":{"@type":"person","name":"Leonardo Farage"},"description":"How to solve typography, RESTful, databases and image caching problems on Android development using widely adopted libraries.","breadcrumb":{"@id":"https:\/\/cheesecakelabs.com\/blog\/how-to-address-common-android-problems\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cheesecakelabs.com\/blog\/how-to-address-common-android-problems\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cheesecakelabs.com\/blog\/how-to-address-common-android-problems\/#primaryimage","url":"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2016\/05\/androidlibrary3.jpg","contentUrl":"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2016\/05\/androidlibrary3.jpg","width":2076,"height":720},{"@type":"BreadcrumbList","@id":"https:\/\/cheesecakelabs.com\/blog\/how-to-address-common-android-problems\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cheesecakelabs.com\/blog\/"},{"@type":"ListItem","position":2,"name":"You don&#8217;t need to code it: how I address common Android problems"}]},{"@type":"WebSite","@id":"https:\/\/cheesecakelabs.com\/blog\/#website","url":"https:\/\/cheesecakelabs.com\/blog\/","name":"Cheesecake Labs","description":"Nearshore outsourcing company for Web and Mobile design and engineering services, and staff augmentation for startups and enterprises..","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/cheesecakelabs.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","name":"Leonardo Farage","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cheesecakelabs.com\/blog\/#\/schema\/person\/image\/","url":false,"contentUrl":false,"caption":"Leonardo Farage"},"description":"10 years of experience in Marketing and Sales in the Technology sector. My main purpose is help, support and structure efficient operations and also develop independent and multidisciplinary teams.","url":"https:\/\/cheesecakelabs.com\/blog\/autor\/leonardo-2\/"}]}},"_links":{"self":[{"href":"https:\/\/cheesecakelabs.com\/blog\/wp-json\/wp\/v2\/posts\/2818","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cheesecakelabs.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cheesecakelabs.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cheesecakelabs.com\/blog\/wp-json\/wp\/v2\/users\/65"}],"replies":[{"embeddable":true,"href":"https:\/\/cheesecakelabs.com\/blog\/wp-json\/wp\/v2\/comments?post=2818"}],"version-history":[{"count":1,"href":"https:\/\/cheesecakelabs.com\/blog\/wp-json\/wp\/v2\/posts\/2818\/revisions"}],"predecessor-version":[{"id":10344,"href":"https:\/\/cheesecakelabs.com\/blog\/wp-json\/wp\/v2\/posts\/2818\/revisions\/10344"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cheesecakelabs.com\/blog\/wp-json\/wp\/v2\/media\/2935"}],"wp:attachment":[{"href":"https:\/\/cheesecakelabs.com\/blog\/wp-json\/wp\/v2\/media?parent=2818"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cheesecakelabs.com\/blog\/wp-json\/wp\/v2\/categories?post=2818"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cheesecakelabs.com\/blog\/wp-json\/wp\/v2\/tags?post=2818"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}