{"id":426,"date":"2013-09-20T11:15:49","date_gmt":"2013-09-20T10:15:49","guid":{"rendered":"http:\/\/karstieltopia.com\/?p=426"},"modified":"2016-02-25T14:16:40","modified_gmt":"2016-02-25T13:16:40","slug":"programando-con-multihilos-usando-asynctask-en-android","status":"publish","type":"post","link":"http:\/\/karstieltopia.com\/programacion\/java\/programando-con-multihilos-usando-asynctask-en-android\/","title":{"rendered":"Programando con multihilos usando AsyncTask en Android"},"content":{"rendered":"

Si hab\u00e9is estado programando para Android desde tiempos inmemoriales (al menos hasta el 2.x), estar\u00edais acostumbrados a utilizar Threads de la forma usual de Java.<\/p>\n

Pero si ese c\u00f3digo lo compil\u00e1is para alguna versi\u00f3n >=3.0, ver\u00e9is que rompe en tiempo de ejecuci\u00f3n con alg\u00fan mensaje cr\u00edptico y, la raz\u00f3n de ello, es que se decidi\u00f3 que todo hilo deber\u00eda hacerse utilizando un sistema diferente: AsyncTask<\/strong><\/p>\n

Utilizar esta clase en nuestros proyectos es muy f\u00e1cil y no necesitaremos hacer ning\u00fan tipo de invocaci\u00f3n esot\u00e9rica.<\/p>\n

\r\n\r\nprivate class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {\r\n protected Long doInBackground(URL... urls) {\r\n int count = urls.length;\r\n long totalSize = 0;\r\n for (int i = 0; i < count; i++) {\r\n totalSize += Downloader.downloadFile(urls[i]);\r\n publishProgress((int) ((i \/ (float) count) * 100));\r\n \/\/ Escape early if cancel() is called\r\n if (isCancelled()) break;\r\n }\r\n return totalSize;\r\n }\r\n\r\nprotected void onProgressUpdate(Integer... progress) {\r\n setProgressPercent(progress[0]);\r\n }\r\n\r\nprotected void onPostExecute(Long result) {\r\n showDialog("Downloaded " + result + " bytes");\r\n }\r\n}\r\n\r\n<\/pre>\n

Este ejemplo es que nos ofrece la API de Android<\/a> para ver el funcionamiento de esta API.<\/p>\n

B\u00e1sicamente tenemos que crear una clase que extienda de AsyncTask<\/strong> e indicarle (si queremos, dado que es posible pasarle Void<\/strong> para indicarle que no lo queremos usar) los siguientes par\u00e1metros:<\/p>\n

    \n
  1. Params<\/strong><\/em>. Este es el tipo del par\u00e1metro que le enviaremos a la tarea cuando est\u00e9 a punto de empezar.<\/span><\/li>\n
  2. Progress<\/strong><\/em>. Aqu\u00ed tendremos una forma de indicar el progreso de una tarea dado que esta es la representaci\u00f3n de la unidad incremental de la tarea.<\/li>\n
  3. Result<\/strong><\/em>. El resultado final.<\/li>\n<\/ol>\n

    Si observamos m\u00e1s el ejemplo, vemos que tiene los siguientes m\u00e9todos:<\/p>\n

      \n
    1. doInBackground<\/strong>. Este m\u00e9todo toma como par\u00e1metros los indicados en Params y accede a ellos como si fuera un array. As\u00ed mismo devuelve un resultado del tipo Result. Este m\u00e9todo es el que se encarga de hacer toda la tarea, as\u00ed que ser\u00e1 siempre el que lleve nuestra l\u00f3gica<\/span><\/li>\n
    2. onProgressUpdate<\/strong>. Este m\u00e9todo se utiliza para indicar que se est\u00e1 trabajando (por ejemplo una barra de progreso), aunque no tendremos una forma directa de mostrar el tiempo exacto restante.<\/li>\n
    3. onPostExecute<\/strong>. Aqu\u00ed obtendremos el resultado de lo que haya hecho la aplicaci\u00f3n.<\/li>\n<\/ol>\n

      Pero tambi\u00e9n tenemos dos m\u00e9todos extra:<\/p>\n

        \n
      1. onPreExecute<\/strong>. M\u00e9todo que se llamar\u00e1 antes de empezar con el resto de tareas. \u00datil para inicializar.<\/span><\/li>\n
      2. onCancelled<\/strong>. Se le llama cuando se cancela una tarea.<\/li>\n<\/ol>\n

        Teniendo todo \u00e9sto, \u00bfc\u00f3mo lo ejecutamos? Pues f\u00e1cilmente:<\/p>\n

        \r\n\r\nnew DownloadFilesTask().execute(url1, url2, url3);\r\n\r\n<\/pre>\n

        Y por \u00faltimo tenemos una serie de detalles que son interesantes de saber:<\/p>\n

          \n
        1. Si quieres cancelar una tarea, solamente tienes que invocar al m\u00e9todo cancel<\/strong>.<\/span><\/li>\n
        2. No hay que llamar a los m\u00e9todos (on…<\/strong>) manualmente<\/li>\n
        3. Solo puede haber una tarea de un tiempo en funcionamiento y debe ser llamada desde la UI.<\/li>\n<\/ol>\n

          Links<\/strong><\/em><\/p>\n

          http:\/\/developer.android.com\/reference\/android\/os\/AsyncTask.html<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"

          Si hab\u00e9is estado programando para Android desde tiempos inmemoriales (al menos hasta el 2.x), estar\u00edais acostumbrados a utilizar Threads de la forma usual de Java. Pero si ese c\u00f3digo lo compil\u00e1is para alguna versi\u00f3n >=3.0, ver\u00e9is que rompe en tiempo de ejecuci\u00f3n con alg\u00fan mensaje cr\u00edptico y, la raz\u00f3n de ello, es que se decidi\u00f3 […]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"spay_email":"","jetpack_publicize_message":"","jetpack_is_tweetstorm":false},"categories":[22],"tags":[44,101],"jetpack_featured_media_url":"","jetpack_publicize_connections":[],"yoast_head":"\nProgramando con multihilos usando AsyncTask en Android - Karstieltopia<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/karstieltopia.com\/programacion\/java\/programando-con-multihilos-usando-asynctask-en-android\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Programando con multihilos usando AsyncTask en Android - Karstieltopia\" \/>\n<meta property=\"og:description\" content=\"Si hab\u00e9is estado programando para Android desde tiempos inmemoriales (al menos hasta el 2.x), estar\u00edais acostumbrados a utilizar Threads de la forma usual de Java. Pero si ese c\u00f3digo lo compil\u00e1is para alguna versi\u00f3n >=3.0, ver\u00e9is que rompe en tiempo de ejecuci\u00f3n con alg\u00fan mensaje cr\u00edptico y, la raz\u00f3n de ello, es que se decidi\u00f3 […]\" \/>\n<meta property=\"og:url\" content=\"http:\/\/karstieltopia.com\/programacion\/java\/programando-con-multihilos-usando-asynctask-en-android\/\" \/>\n<meta property=\"og:site_name\" content=\"Karstieltopia\" \/>\n<meta property=\"article:published_time\" content=\"2013-09-20T10:15:49+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2016-02-25T13:16:40+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary\" \/>\n<meta name=\"twitter:creator\" content=\"@karstiel\" \/>\n<meta name=\"twitter:site\" content=\"@karstiel\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"http:\/\/karstieltopia.com\/#website\",\"url\":\"http:\/\/karstieltopia.com\/\",\"name\":\"Karstieltopia\",\"description\":\"Programaci\\u00f3n, tecnolog\\u00eda y a\\u00f1adidos\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":\"http:\/\/karstieltopia.com\/?s={search_term_string}\",\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"es\"},{\"@type\":\"WebPage\",\"@id\":\"http:\/\/karstieltopia.com\/programacion\/java\/programando-con-multihilos-usando-asynctask-en-android\/#webpage\",\"url\":\"http:\/\/karstieltopia.com\/programacion\/java\/programando-con-multihilos-usando-asynctask-en-android\/\",\"name\":\"Programando con multihilos usando AsyncTask en Android - Karstieltopia\",\"isPartOf\":{\"@id\":\"http:\/\/karstieltopia.com\/#website\"},\"datePublished\":\"2013-09-20T10:15:49+00:00\",\"dateModified\":\"2016-02-25T13:16:40+00:00\",\"author\":{\"@id\":\"http:\/\/karstieltopia.com\/#\/schema\/person\/3d09a55c38c7c00e78c41fa3f71a6e75\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\/\/karstieltopia.com\/programacion\/java\/programando-con-multihilos-usando-asynctask-en-android\/\"]}]},{\"@type\":\"Person\",\"@id\":\"http:\/\/karstieltopia.com\/#\/schema\/person\/3d09a55c38c7c00e78c41fa3f71a6e75\",\"name\":\"karstiel\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p6AuIG-6S","_links":{"self":[{"href":"http:\/\/karstieltopia.com\/wp-json\/wp\/v2\/posts\/426"}],"collection":[{"href":"http:\/\/karstieltopia.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/karstieltopia.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/karstieltopia.com\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/karstieltopia.com\/wp-json\/wp\/v2\/comments?post=426"}],"version-history":[{"count":11,"href":"http:\/\/karstieltopia.com\/wp-json\/wp\/v2\/posts\/426\/revisions"}],"predecessor-version":[{"id":443,"href":"http:\/\/karstieltopia.com\/wp-json\/wp\/v2\/posts\/426\/revisions\/443"}],"wp:attachment":[{"href":"http:\/\/karstieltopia.com\/wp-json\/wp\/v2\/media?parent=426"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/karstieltopia.com\/wp-json\/wp\/v2\/categories?post=426"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/karstieltopia.com\/wp-json\/wp\/v2\/tags?post=426"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}