{"id":1560,"date":"2015-05-24T16:49:51","date_gmt":"2015-05-24T11:19:51","guid":{"rendered":"https:\/\/www.innovationm.com\/blog\/?p=1560"},"modified":"2015-05-24T18:34:17","modified_gmt":"2015-05-24T13:04:17","slug":"multiple-asynctask-in-android","status":"publish","type":"post","link":"https:\/\/www.innovationm.com\/blog\/multiple-asynctask-in-android\/","title":{"rendered":"Multiple AsyncTask In Android"},"content":{"rendered":"<h1><strong>What is AsyncTask<\/strong><\/h1>\n<p><strong><\/strong>AsyncTask is an abstract Android class which helps the Android applications to perform tasks without blocking the UI Thread.\u00a0AsyncTask is designed to be a helper class around Thread and Handler.<\/p>\n<h1><span style=\"font-size: 1.285714286rem;line-height: 1.6;text-align: justify\">Thread Pool Pattern<\/span><\/h1>\n<p>AsyncTask uses a thread pool pattern for running the stuff from doInBackground()<\/p>\n<p>The <strong>Thread pool Pattern<\/strong>\u00a0is where number of Threads\u00a0are created to perform a number of Tasks. It is basically a container where multiple threads come in a queue for different task.<\/p>\n<h2>Multiple AsyncTasks In Android<\/h2>\n<p>In earlier version of Android (Donut and below), multiple AsyncTasks execution were not allowed. The pool size was just 1. But after Donut (1.6) it has been relaxed and now the size is 5, so at most 5 AsyncTasks can run simultaneously.<\/p>\n<h2>Limitation Of AsyncTask<\/h2>\n<p style=\"text-align: justify\">There is a limit of how many tasks can be run simultaneously.\u00a0Since AsyncTask uses a thread pool executor with max number of worker threads (128) and the delayed tasks queue has fixed size 10. If you try to execute more than 138 AsyncTasks the app will crash with java.util.concurrent.RejectedExecutionException.<\/p>\n<h1 style=\"text-align: justify\">Delayed Queue Size<\/h1>\n<p style=\"text-align: justify\">AsyncTasks use a fixed size queue internally for storing delayed tasks. Queue size is 10 by default. If you start 15 AsyncTasks in a row, then first 5 will enter their doInBackground(), but the rest will wait in a queue for a free worker thread. As soon as any of the first 5 AsyncTasks finishes, and thus releases a worker thread,\u00a0a task from the queue will start execution. So in this case at most 5 tasks will run simultaneously. However if you start 16 your custom tasks in a row,\u00a0then first 5 will enter their doInBackground(), the rest 10 will get into the queue, but for the 16th, a new worker thread will be created so it&#8217;ll start execution immediately. So in this case at most 6 tasks will run simultaneously.<\/p>\n<h2 style=\"text-align: justify\">Change Delayed Queue Size<\/h2>\n<p style=\"text-align: justify\">Starting from Android version 3.0, the API allows to use your custom thread pool executor via AsyncTask.executeOnExecutor(Executor exec, Params&#8230; params) method.\u00a0This allows to configure the size of the delayed tasks queue (Default size 10) .\u00a0Here you can give your own executor to execute custom number of thread means you can change the number of thread to execute in parallel.\u00a0There are some common application errors caused by parallel execution like InterruptedExecution and IllegalStateException so it is recommended to do not use multiple AsyncTask in parallel but, if you really have a need you can override Android&#8217;s default behaviour using\u00a0AsyncTask.executeOnExecutor(Executor, Object[]), passing in a THREAD_POOL_EXECUTOR. \u00a0 \u00a0<code><\/code><code>\u00a0<\/code><\/p>\n<h2 style=\"text-align: justify\">Criteria of using Multiple AsyncTask<\/h2>\n<p><strong>Before Donut (Till 1.6 Version)<\/strong><br \/>\nThere was no concept of Multiple AsyncTask.<\/p>\n<p><strong>After Donut and till Honeycomb (1.6 &#8211; 3.0)<\/strong><br \/>\nHere it uses multiple AsyncTask in parallel by default and you cannot customize it.<\/p>\n<p><strong>After Honeycomb and till Jelly Bean (Version 3.0 &#8211; 4.3.1)<\/strong><br \/>\nprivate static final int CORE_POOL_SIZE = 5;<br \/>\nprivate static final int MAXIMUM_POOL_SIZE = 128;<br \/>\nprivate static final BlockingQueue&lt;Runnable&gt; sPoolWorkQueue = new LinkedBlockingQueue&lt;Runnable&gt;(10);<\/p>\n<p><strong>From KitKat (4.4 Above):<\/strong><br \/>\nprivate static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();<br \/>\nprivate static final int CORE_POOL_SIZE = CPU_COUNT + 1;<br \/>\nprivate static final int MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1;<br \/>\nprivate static final BlockingQueue&lt;Runnable&gt; sPoolWorkQueue = new LinkedBlockingQueue&lt;Runnable&gt;(128);<\/p>\n<h2><strong>Example to showcase multiple AsyncTask<\/strong><\/h2>\n<pre class=\"lang:default decode:true\" title=\"Multiple AsyncTask Example\">public class MultipleAsyncTask extends Activity\r\n{\r\n\t@Override\r\n\tprotected void onCreate(Bundle savedInstanceState)\r\n\t{\r\n\t\tsuper.onCreate(savedInstanceState);\r\n\t\trunMultipleAsyncTask(); \/\/ Start Async Task\r\n\t}\r\n\tprivate void runMultipleAsyncTask() \/\/ Run Multiple Async Task\r\n\t{\r\n\t\tFirstAsyncTask asyncTask = new FirstAsyncTask(); \/\/ First\r\n\t\tif(AppUtil.isCurrentVersionHoneycombAndAbove()) \/\/ Above Api Level 13\r\n\t\t{\r\n\t\t\tasyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);\r\n\t\t}\r\n\t\telse \/\/ Below Api Level 13\r\n\t\t{\r\n\t\t\tasyncTask.execute();\r\n\t\t}\r\n\t\tSecondAsyncTask asyncTask2 = new SecondAsyncTask(); \/\/ Second\r\n\t\tif(AppUtil.isCurrentVersionHoneycombAndAbove())\/\/ Above Api Level 13\r\n\t\t{\r\n\t\t\tasyncTask2.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);\r\n\t\t}\r\n\t\telse \/\/ Below Api Level 13\r\n\t\t{\r\n\t\t\tasyncTask2.execute();\r\n\t\t}\r\n\t}\r\n\t\/\/Start First Async Task:\r\n\tprivate class FirstAsyncTask extends AsyncTask&lt;Void, Void, Void&gt;\r\n\t{\r\n\t\t@Override\r\n\t\tprotected void onPreExecute()\r\n\t\t{\r\n\t\t\tLog.i(\"AsyncTask\" ,\"FirstOnPreExecute()\");\r\n\t\t}\r\n\t\t@Override\r\n\t\tprotected Void doInBackground(Void... params)\r\n\t\t{\r\n\t\t\tfor(int index = 0; index &lt; 50; index++)\r\n\t\t\t{\r\n\t\t\t\tLog.i(\"AsyncTask\" ,\"FirstAsyncTask\");\r\n\t\t\t\ttry\r\n\t\t\t\t{\r\n\t\t\t\t\tThread.sleep(100);\r\n\t\t\t\t}\r\n\t\t\t\tcatch (InterruptedException exception)\r\n\t\t\t\t{\r\n\t\t\t\t\texception.printStackTrace();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\t@Override\r\n\t\tprotected void onPostExecute(Void result)\r\n\t\t{\r\n\t\t\tLog.d(\"AsyncTask\" ,\"FirstonPostExecute()\");\r\n\t\t}\r\n\t}\r\n\t\/\/Start Second Async Task:\r\n\tprivate class SecondAsyncTask extends AsyncTask&lt;Void, Void, Void&gt;\r\n\t{\r\n\t\t@Override\r\n\t\tprotected void onPreExecute()\r\n\t\t{\r\n\t\t\tLog.i(\"AsyncTask\" ,\"SecondOnPreExecute()\");\r\n\t\t}\r\n\t\t@Override\r\n\t\tprotected Void doInBackground(Void... params)\r\n\t\t{\r\n\t\t\tfor(int index = 0; index &lt; 50; index++)\r\n\t\t\t{\r\n\t\t\t\tLog.d(\"AsyncTask\" ,\"SecondAsyncTask\");\r\n\t\t\t\ttry\r\n\t\t\t\t{\r\n\t\t\t\t\tThread.sleep(100);\r\n\t\t\t\t}\r\n\t\t\t\tcatch (InterruptedException exception)\r\n\t\t\t\t{\r\n\t\t\t\t\texception.printStackTrace();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\t@Override\r\n\t\tprotected void onPostExecute(Void result)\r\n\t\t{\r\n\t\t\tLog.d(\"AsyncTask\" ,\"SecondOnPostExecute()\");\r\n\t\t}\r\n\t}\r\n}<\/pre>\n<p>Result:<\/p>\n<p>FirstOnPreExecute()<br \/>\nSecondOnPreExecute()<br \/>\nFirstAsyncTask<br \/>\nSecondAsyncTask<br \/>\nFirstAsyncTask<br \/>\nSecondAsyncTask<br \/>\nFirstAsyncTask<br \/>\nSecondAsyncTask<br \/>\nFirstAsyncTask<br \/>\nSecondAsyncTask<br \/>\nFirstAsyncTask<br \/>\nSecondAsyncTask<br \/>\nFirstAsyncTask<br \/>\nSecondAsyncTask<br \/>\nFirstAsyncTask<br \/>\nSecondAsyncTask<br \/>\nFirstAsyncTask<br \/>\nSecondAsyncTask<br \/>\nFirstAsyncTask<br \/>\nSecondAsyncTask<br \/>\nFirstAsyncTask<br \/>\nSecondAsyncTask<br \/>\nFirstonPostExecute()<br \/>\nSecondOnPostExecute()<\/p>\n","protected":false},"excerpt":{"rendered":"<p>What is AsyncTask AsyncTask is an abstract Android class which helps the Android applications to perform tasks without blocking the UI Thread.\u00a0AsyncTask is designed to be a helper class around Thread and Handler. Thread Pool Pattern AsyncTask uses a thread pool pattern for running the stuff from doInBackground() The Thread pool Pattern\u00a0is where number of [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2,71,8],"tags":[159,153,14,165,154],"class_list":["post-1560","post","type-post","status-publish","format-standard","hentry","category-android","category-mobile","category-mobile-architecture-and-design","tag-android","tag-asynctask","tag-innovationm","tag-mobile","tag-thread"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Multiple AsyncTask In Android - InnovationM - Blog<\/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.innovationm.com\/blog\/multiple-asynctask-in-android\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Multiple AsyncTask In Android - InnovationM - Blog\" \/>\n<meta property=\"og:description\" content=\"What is AsyncTask AsyncTask is an abstract Android class which helps the Android applications to perform tasks without blocking the UI Thread.\u00a0AsyncTask is designed to be a helper class around Thread and Handler. Thread Pool Pattern AsyncTask uses a thread pool pattern for running the stuff from doInBackground() The Thread pool Pattern\u00a0is where number of [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.innovationm.com\/blog\/multiple-asynctask-in-android\/\" \/>\n<meta property=\"og:site_name\" content=\"InnovationM - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2015-05-24T11:19:51+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2015-05-24T13:04:17+00:00\" \/>\n<meta name=\"author\" content=\"InnovationM Admin\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"InnovationM Admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/multiple-asynctask-in-android\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/multiple-asynctask-in-android\\\/\"},\"author\":{\"name\":\"InnovationM Admin\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#\\\/schema\\\/person\\\/a831bf4602d69d1fa452e3de0c8862ed\"},\"headline\":\"Multiple AsyncTask In Android\",\"datePublished\":\"2015-05-24T11:19:51+00:00\",\"dateModified\":\"2015-05-24T13:04:17+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/multiple-asynctask-in-android\\\/\"},\"wordCount\":567,\"commentCount\":0,\"keywords\":[\"Android\",\"AsyncTask\",\"InnovationM\",\"Mobile\",\"Thread\"],\"articleSection\":[\"Android\",\"Mobile\",\"Mobile Architecture and Design\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/multiple-asynctask-in-android\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/multiple-asynctask-in-android\\\/\",\"url\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/multiple-asynctask-in-android\\\/\",\"name\":\"Multiple AsyncTask In Android - InnovationM - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#website\"},\"datePublished\":\"2015-05-24T11:19:51+00:00\",\"dateModified\":\"2015-05-24T13:04:17+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#\\\/schema\\\/person\\\/a831bf4602d69d1fa452e3de0c8862ed\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/multiple-asynctask-in-android\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/multiple-asynctask-in-android\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/multiple-asynctask-in-android\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Multiple AsyncTask In Android\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/\",\"name\":\"InnovationM - Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#\\\/schema\\\/person\\\/a831bf4602d69d1fa452e3de0c8862ed\",\"name\":\"InnovationM Admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g\",\"caption\":\"InnovationM Admin\"},\"sameAs\":[\"http:\\\/\\\/www.innovationm.com\\\/\"],\"url\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/author\\\/innovationmadmin\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Multiple AsyncTask In Android - InnovationM - Blog","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.innovationm.com\/blog\/multiple-asynctask-in-android\/","og_locale":"en_US","og_type":"article","og_title":"Multiple AsyncTask In Android - InnovationM - Blog","og_description":"What is AsyncTask AsyncTask is an abstract Android class which helps the Android applications to perform tasks without blocking the UI Thread.\u00a0AsyncTask is designed to be a helper class around Thread and Handler. Thread Pool Pattern AsyncTask uses a thread pool pattern for running the stuff from doInBackground() The Thread pool Pattern\u00a0is where number of [&hellip;]","og_url":"https:\/\/www.innovationm.com\/blog\/multiple-asynctask-in-android\/","og_site_name":"InnovationM - Blog","article_published_time":"2015-05-24T11:19:51+00:00","article_modified_time":"2015-05-24T13:04:17+00:00","author":"InnovationM Admin","twitter_misc":{"Written by":"InnovationM Admin","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.innovationm.com\/blog\/multiple-asynctask-in-android\/#article","isPartOf":{"@id":"https:\/\/www.innovationm.com\/blog\/multiple-asynctask-in-android\/"},"author":{"name":"InnovationM Admin","@id":"https:\/\/www.innovationm.com\/blog\/#\/schema\/person\/a831bf4602d69d1fa452e3de0c8862ed"},"headline":"Multiple AsyncTask In Android","datePublished":"2015-05-24T11:19:51+00:00","dateModified":"2015-05-24T13:04:17+00:00","mainEntityOfPage":{"@id":"https:\/\/www.innovationm.com\/blog\/multiple-asynctask-in-android\/"},"wordCount":567,"commentCount":0,"keywords":["Android","AsyncTask","InnovationM","Mobile","Thread"],"articleSection":["Android","Mobile","Mobile Architecture and Design"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.innovationm.com\/blog\/multiple-asynctask-in-android\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.innovationm.com\/blog\/multiple-asynctask-in-android\/","url":"https:\/\/www.innovationm.com\/blog\/multiple-asynctask-in-android\/","name":"Multiple AsyncTask In Android - InnovationM - Blog","isPartOf":{"@id":"https:\/\/www.innovationm.com\/blog\/#website"},"datePublished":"2015-05-24T11:19:51+00:00","dateModified":"2015-05-24T13:04:17+00:00","author":{"@id":"https:\/\/www.innovationm.com\/blog\/#\/schema\/person\/a831bf4602d69d1fa452e3de0c8862ed"},"breadcrumb":{"@id":"https:\/\/www.innovationm.com\/blog\/multiple-asynctask-in-android\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.innovationm.com\/blog\/multiple-asynctask-in-android\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.innovationm.com\/blog\/multiple-asynctask-in-android\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.innovationm.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Multiple AsyncTask In Android"}]},{"@type":"WebSite","@id":"https:\/\/www.innovationm.com\/blog\/#website","url":"https:\/\/www.innovationm.com\/blog\/","name":"InnovationM - Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.innovationm.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.innovationm.com\/blog\/#\/schema\/person\/a831bf4602d69d1fa452e3de0c8862ed","name":"InnovationM Admin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g","caption":"InnovationM Admin"},"sameAs":["http:\/\/www.innovationm.com\/"],"url":"https:\/\/www.innovationm.com\/blog\/author\/innovationmadmin\/"}]}},"_links":{"self":[{"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/posts\/1560","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/comments?post=1560"}],"version-history":[{"count":0,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/posts\/1560\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/media?parent=1560"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/categories?post=1560"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/tags?post=1560"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}