{"id":863471,"date":"2020-05-15T03:59:02","date_gmt":"2020-05-15T10:59:02","guid":{"rendered":"https:\/\/www.esri.com\/arcgis-blog\/?post_type=blog&#038;p=863471"},"modified":"2020-05-22T06:09:01","modified_gmt":"2020-05-22T13:09:01","slug":"a-pitfall-of-asynchronous-java-code","status":"publish","type":"blog","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/field-mobility\/a-pitfall-of-asynchronous-java-code","title":{"rendered":"A pitfall of asynchronous Java code"},"author":30781,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"open","ping_status":"closed","template":"","format":"standard","meta":{"_acf_changed":false,"_searchwp_excluded":""},"categories":[23261],"tags":[23451,662981,662971,662991,663001],"industry":[],"product":[36881,36901,36601],"class_list":["post-863471","blog","type-blog","status-publish","format-standard","hentry","category-field-mobility","tag-arcgis-runtime","tag-arcgis-runtime-sdk-for-android","tag-arcgis-runtime-sdk-for-java","tag-javafx","tag-kotlin","product-api-for-android","product-api-java","product-developers"],"acf":{"short_description":"Make sure that your Kotlin or Java applications are robust when using asynchronous code.","flexible_content":[{"acf_fc_layout":"content","content":"<p>When writing applications using the ArcGIS Runtime SDK for Android or Java SE we naturally use asynchronous programming when working with potentially slow to respond resources.  This means that we have user interfaces which are always responsive and don&#8217;t freeze.\u00a0 Typically, these resources are web services which may have very good server infrastructure, but your experience of these services is at the mercy of the internet.\u00a0 Mostly it\u2019s pretty good, but sometimes it requires a little patience! <\/p>\n<p>The solution to these patience-testing situations in applications is well established, we don\u2019t block the UI thread of our app but instead ensure that potentially blocking code is run on a separate thread until it completes its task.\u00a0 <\/p>\n<p>In other words, when we are waiting for something to respond, we will use a call-back which will respond on a separate thread once something useful has happened. Let\u2019s take a look at some code which has a potential bug.\u00a0 This code may work, but sometimes if you are unlucky, it won\u2019t.<\/p>\n<div>\n<pre style=\"background: #ffffff;overflow: auto;width: auto;border: solid gray;border-width: .1em .1em .1em .8em;padding: .2em .6em;margin: 0;line-height: 125%\"><span style=\"color: #888888\">\/\/ create feature layer with its service feature table<\/span>\r\n<span style=\"color: #888888\">\/\/ create the service feature table<\/span>\r\nServiceFeatureTable serviceFeatureTable <span style=\"color: #333333\">=<\/span> <span style=\"color: #008800;font-weight: bold\">new<\/span> ServiceFeatureTable<span style=\"color: #333333\">(<\/span>\r\n    getResources<span style=\"color: #333333\">().<\/span><span style=\"color: #0000cc\">getString<\/span><span style=\"color: #333333\">(<\/span>R<span style=\"color: #333333\">.<\/span><span style=\"color: #0000cc\">string<\/span><span style=\"color: #333333\">.<\/span><span style=\"color: #0000cc\">sample_service_url<\/span><span style=\"color: #333333\">));<\/span>\r\n\r\n<span style=\"color: #888888\">\/\/ create the feature layer using the service feature table<\/span>\r\nFeatureLayer featureLayer <span style=\"color: #333333\">=<\/span> <span style=\"color: #008800;font-weight: bold\">new<\/span> FeatureLayer<span style=\"color: #333333\">(<\/span>serviceFeatureTable<span style=\"color: #333333\">);<\/span>\r\n\r\n<span style=\"color: #888888\">\/\/ trigger the layer to load<\/span>\r\nfeatureLayer<span style=\"color: #333333\">.<\/span><span style=\"color: #0000cc\">loadAsync<\/span><span style=\"color: #333333\">();<\/span>\r\n\r\n<span style=\"color: #888888\">\/\/ this code gets run on a new thread when the feature is loaded.<\/span>\r\nfeatureLayer<span style=\"color: #333333\">.<\/span><span style=\"color: #0000cc\">addDoneLoadingListener<\/span><span style=\"color: #333333\">(()<\/span> <span style=\"color: #333333\">-&gt;<\/span> <span style=\"color: #333333\">{<\/span>\r\n  String desc <span style=\"color: #333333\">=<\/span> featureLayer<span style=\"color: #333333\">.<\/span><span style=\"color: #0000cc\">getDescription<\/span><span style=\"color: #333333\">();<\/span>\r\n  Toast<span style=\"color: #333333\">.<\/span><span style=\"color: #0000cc\">makeText<\/span><span style=\"color: #333333\">(<\/span><span style=\"color: #008800;font-weight: bold\">this<\/span><span style=\"color: #333333\">,<\/span> <span style=\"background-color: #fff0f0\">\"Description: \"<\/span> <span style=\"color: #333333\">+<\/span> desc<span style=\"color: #333333\">,<\/span> Toast<span style=\"color: #333333\">.<\/span><span style=\"color: #0000cc\">LENGTH_SHORT<\/span><span style=\"color: #333333\">).<\/span><span style=\"color: #0000cc\">show<\/span><span style=\"color: #333333\">();<\/span>\r\n<span style=\"color: #333333\">});<\/span>\r\n<\/pre>\n<\/div>\n<p>It is very simple, we are creating a feature layer from a service feature table and loading a feature layer.\u00a0 Once the layer has loaded, we are outputting a message with the name of the layer in a dialog.<\/p>\n<p>Now, when running this code a few times in an Android app, most times the Toast dialog did not display i.e. the code within the loading listener was never executed. Running similar code on a desktop Java Runtime Environment (JRE) was the opposite, and it ran reliably most of the time.<\/p>\n<p>So why would this work sometimes, but sometimes fail albeit randomly?\u00a0 After all, the IDE didn\u2019t show this up as bad code! So, what\u2019s going on?<\/p>\n<p>Well the answer to this is around how the JRE works.\u00a0 The story will be the same for Android Runtime (ART) or Desktop based JREs.\u00a0 Every so often (and you can\u2019t predict when), the JRE will free up resources through a process known as garbage collection.\u00a0 As resources are more limited on Android devices, the garbage collection tends to be more aggressive.\u00a0 All this is good, as it means we don\u2019t run out of resources.<\/p>\n<p>Let\u2019s take a closer look at the code above.\u00a0 You will notice that we are seeing the problem when we are calling back when the resource has loaded.\u00a0 This is happening on a separate thread after the function has completed.\u00a0 The code in the listener run after the featureLayer variable has gone out of scope, so there is a fair probability that the garbage collector will target your variable for recycling before you\u2019ve had a chance to use it! It\u2019s a bit like an impatient waiter clearing away your dinner plate before you finished because you turned to have a conversation with someone beside you! The solution of course it to keep your hand on the plate so it doesn\u2019t disappear when you are looking away.<\/p>\n<p>So how do we \u201ckeep our hand on the plate\u201d in code? The solution is to keep your class instance away from the merciless garbage collector.\u00a0 All you need to do is make your featureLayer variable a class member of your application.\u00a0 These do not go out scope, and are therefore safe from garbage collection.<\/p>\n<div>\n<pre style=\"background: #ffffff;overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;margin: 0;line-height: 125%\"><span style=\"color: #008800;font-weight: bold\">public<\/span> <span style=\"color: #008800;font-weight: bold\">class<\/span> <span style=\"color: #BB0066;font-weight: bold\">MainActivity<\/span> <span style=\"color: #008800;font-weight: bold\">extends<\/span> AppCompatActivity <span style=\"color: #333333\">{<\/span>\r\n\r\n<span style=\"color: #008800;font-weight: bold\">private<\/span> FeatureLayer featureLayer<span style=\"color: #333333\">;<\/span>\r\n<\/pre>\n<\/div>\n<p>This is a pattern that should be adopted in your application code regardless of the resources you are using.\u00a0 You may think that working with a local file will be fast enough to beat the garbage collector, but your users may occasionally experience unexplained app behaviour.\u00a0 It is always best to make your asynchronous code as reliable as possible and remember this applies to Kotlin as well as Java.<\/p>\n<p>&nbsp;<\/p>\n"}],"authors":[{"ID":30781,"user_firstname":"Mark","user_lastname":"Baird","nickname":"mbaird","user_nicename":"mbaird","display_name":"Mark Baird","user_email":"mbaird@esri.com","user_url":"https:\/\/github.com\/mbcoder\/","user_registered":"2020-04-29 09:59:19","user_description":"Mark Baird is the engineering lead for the ArcGIS Maps SDK for Java product. He has worked with GIS for 25 years in both consultancy roles and more recently in product development. This has involved working in many industry areas including environmental science, ecology, insurance risk analysis, public safety and situation awareness systems.","user_avatar":"<img data-del=\"avatar\" src='https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/08\/Mugshot-466x465.png' class='avatar pp-user-avatar avatar-96 photo ' height='96' width='96'\/>"}],"related_articles":"","card_image":false,"wide_image":false},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.9 (Yoast SEO v25.9) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>A pitfall of asynchronous Java code<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/field-mobility\/a-pitfall-of-asynchronous-java-code\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"A pitfall of asynchronous Java code\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/field-mobility\/a-pitfall-of-asynchronous-java-code\" \/>\n<meta property=\"og:site_name\" content=\"ArcGIS Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/esrigis\/\" \/>\n<meta property=\"article:modified_time\" content=\"2020-05-22T13:09:01+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@ESRI\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":[\"Article\",\"BlogPosting\"],\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/field-mobility\/a-pitfall-of-asynchronous-java-code#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/field-mobility\/a-pitfall-of-asynchronous-java-code\"},\"author\":{\"name\":\"Mark Baird\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/403e5f28824843bb88f7a5b3f7974531\"},\"headline\":\"A pitfall of asynchronous Java code\",\"datePublished\":\"2020-05-15T10:59:02+00:00\",\"dateModified\":\"2020-05-22T13:09:01+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/field-mobility\/a-pitfall-of-asynchronous-java-code\"},\"wordCount\":6,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#organization\"},\"keywords\":[\"ArcGIS Runtime\",\"ArcGIS Runtime SDK for Android\",\"ArcGIS Runtime SDK for Java\",\"JavaFX\",\"Kotlin\"],\"articleSection\":[\"Field Operations\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/field-mobility\/a-pitfall-of-asynchronous-java-code#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/field-mobility\/a-pitfall-of-asynchronous-java-code\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/field-mobility\/a-pitfall-of-asynchronous-java-code\",\"name\":\"A pitfall of asynchronous Java code\",\"isPartOf\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#website\"},\"datePublished\":\"2020-05-15T10:59:02+00:00\",\"dateModified\":\"2020-05-22T13:09:01+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/field-mobility\/a-pitfall-of-asynchronous-java-code#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/field-mobility\/a-pitfall-of-asynchronous-java-code\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/field-mobility\/a-pitfall-of-asynchronous-java-code#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.esri.com\/arcgis-blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"A pitfall of asynchronous Java code\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#website\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/\",\"name\":\"ArcGIS Blog\",\"description\":\"Get insider info from Esri product teams\",\"publisher\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.esri.com\/arcgis-blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#organization\",\"name\":\"Esri\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png\",\"contentUrl\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png\",\"width\":400,\"height\":400,\"caption\":\"Esri\"},\"image\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/esrigis\/\",\"https:\/\/x.com\/ESRI\",\"https:\/\/www.linkedin.com\/company\/5311\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/403e5f28824843bb88f7a5b3f7974531\",\"name\":\"Mark Baird\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/08\/Mugshot-466x465.png\",\"contentUrl\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/08\/Mugshot-466x465.png\",\"caption\":\"Mark Baird\"},\"description\":\"Mark Baird is the engineering lead for the ArcGIS Maps SDK for Java product. He has worked with GIS for 25 years in both consultancy roles and more recently in product development. This has involved working in many industry areas including environmental science, ecology, insurance risk analysis, public safety and situation awareness systems.\",\"sameAs\":[\"https:\/\/github.com\/mbcoder\/\",\"https:\/\/www.linkedin.com\/in\/mark-baird-5565786\/\",\"https:\/\/studio.youtube.com\/channel\/UC4WdKUaIqjVKNomMycQuOHw\/videos\/upload?filter=&sort=columnTypedatesortOrderDESCENDING\"],\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/author\/mbaird\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"A pitfall of asynchronous Java code","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:\/\/www.esri.com\/arcgis-blog\/products\/developers\/field-mobility\/a-pitfall-of-asynchronous-java-code","og_locale":"en_US","og_type":"article","og_title":"A pitfall of asynchronous Java code","og_url":"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/field-mobility\/a-pitfall-of-asynchronous-java-code","og_site_name":"ArcGIS Blog","article_publisher":"https:\/\/www.facebook.com\/esrigis\/","article_modified_time":"2020-05-22T13:09:01+00:00","twitter_card":"summary_large_image","twitter_site":"@ESRI","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":["Article","BlogPosting"],"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/field-mobility\/a-pitfall-of-asynchronous-java-code#article","isPartOf":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/field-mobility\/a-pitfall-of-asynchronous-java-code"},"author":{"name":"Mark Baird","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/403e5f28824843bb88f7a5b3f7974531"},"headline":"A pitfall of asynchronous Java code","datePublished":"2020-05-15T10:59:02+00:00","dateModified":"2020-05-22T13:09:01+00:00","mainEntityOfPage":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/field-mobility\/a-pitfall-of-asynchronous-java-code"},"wordCount":6,"commentCount":0,"publisher":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#organization"},"keywords":["ArcGIS Runtime","ArcGIS Runtime SDK for Android","ArcGIS Runtime SDK for Java","JavaFX","Kotlin"],"articleSection":["Field Operations"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/field-mobility\/a-pitfall-of-asynchronous-java-code#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/field-mobility\/a-pitfall-of-asynchronous-java-code","url":"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/field-mobility\/a-pitfall-of-asynchronous-java-code","name":"A pitfall of asynchronous Java code","isPartOf":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#website"},"datePublished":"2020-05-15T10:59:02+00:00","dateModified":"2020-05-22T13:09:01+00:00","breadcrumb":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/field-mobility\/a-pitfall-of-asynchronous-java-code#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/field-mobility\/a-pitfall-of-asynchronous-java-code"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/field-mobility\/a-pitfall-of-asynchronous-java-code#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.esri.com\/arcgis-blog\/"},{"@type":"ListItem","position":2,"name":"A pitfall of asynchronous Java code"}]},{"@type":"WebSite","@id":"https:\/\/www.esri.com\/arcgis-blog\/#website","url":"https:\/\/www.esri.com\/arcgis-blog\/","name":"ArcGIS Blog","description":"Get insider info from Esri product teams","publisher":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.esri.com\/arcgis-blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.esri.com\/arcgis-blog\/#organization","name":"Esri","url":"https:\/\/www.esri.com\/arcgis-blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png","contentUrl":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png","width":400,"height":400,"caption":"Esri"},"image":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/esrigis\/","https:\/\/x.com\/ESRI","https:\/\/www.linkedin.com\/company\/5311\/"]},{"@type":"Person","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/403e5f28824843bb88f7a5b3f7974531","name":"Mark Baird","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/image\/","url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/08\/Mugshot-466x465.png","contentUrl":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/08\/Mugshot-466x465.png","caption":"Mark Baird"},"description":"Mark Baird is the engineering lead for the ArcGIS Maps SDK for Java product. He has worked with GIS for 25 years in both consultancy roles and more recently in product development. This has involved working in many industry areas including environmental science, ecology, insurance risk analysis, public safety and situation awareness systems.","sameAs":["https:\/\/github.com\/mbcoder\/","https:\/\/www.linkedin.com\/in\/mark-baird-5565786\/","https:\/\/studio.youtube.com\/channel\/UC4WdKUaIqjVKNomMycQuOHw\/videos\/upload?filter=&sort=columnTypedatesortOrderDESCENDING"],"url":"https:\/\/www.esri.com\/arcgis-blog\/author\/mbaird"}]}},"text_date":"May 15, 2020","author_name":"Mark Baird","author_page":"https:\/\/www.esri.com\/arcgis-blog\/author\/mbaird","custom_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/08\/Newsroom-Keyart-Wide-1920-x-1080.jpg","primary_product":"Developers","tag_data":[{"term_id":23451,"name":"ArcGIS Runtime","slug":"arcgis-runtime","term_group":0,"term_taxonomy_id":23451,"taxonomy":"post_tag","description":"","parent":0,"count":91,"filter":"raw"},{"term_id":662981,"name":"ArcGIS Runtime SDK for Android","slug":"arcgis-runtime-sdk-for-android","term_group":0,"term_taxonomy_id":662981,"taxonomy":"post_tag","description":"","parent":0,"count":2,"filter":"raw"},{"term_id":662971,"name":"ArcGIS Runtime SDK for Java","slug":"arcgis-runtime-sdk-for-java","term_group":0,"term_taxonomy_id":662971,"taxonomy":"post_tag","description":"","parent":0,"count":3,"filter":"raw"},{"term_id":662991,"name":"JavaFX","slug":"javafx","term_group":0,"term_taxonomy_id":662991,"taxonomy":"post_tag","description":"","parent":0,"count":2,"filter":"raw"},{"term_id":663001,"name":"Kotlin","slug":"kotlin","term_group":0,"term_taxonomy_id":663001,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"}],"category_data":[{"term_id":23261,"name":"Field Operations","slug":"field-mobility","term_group":0,"term_taxonomy_id":23261,"taxonomy":"category","description":"","parent":0,"count":617,"filter":"raw"}],"product_data":[{"term_id":36881,"name":"ArcGIS Runtime SDK for Android","slug":"api-for-android","term_group":0,"term_taxonomy_id":36881,"taxonomy":"product","description":"","parent":36601,"count":65,"filter":"raw"},{"term_id":36901,"name":"ArcGIS Runtime SDK for Java","slug":"api-java","term_group":0,"term_taxonomy_id":36901,"taxonomy":"product","description":"","parent":36601,"count":59,"filter":"raw"},{"term_id":36601,"name":"Developers","slug":"developers","term_group":0,"term_taxonomy_id":36601,"taxonomy":"product","description":"","parent":0,"count":765,"filter":"raw"}],"primary_product_link":"https:\/\/www.esri.com\/arcgis-blog\/?s=#&products=developers","_links":{"self":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog\/863471","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/users\/30781"}],"replies":[{"embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/comments?post=863471"}],"version-history":[{"count":0,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog\/863471\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/media?parent=863471"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/categories?post=863471"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/tags?post=863471"},{"taxonomy":"industry","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/industry?post=863471"},{"taxonomy":"product","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/product?post=863471"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}