Hace TimerTask ejecutando en nuevo hilo

¿Puedo considerar que el código en run se ejecutará en nuevo hilo o debo utilizar AsyncTask ?

 Timer myTimer = new Timer(); // Создаем таймер final Handler uiHandler = new Handler(); myTimer.schedule(new TimerTask() { // Определяем задачу @Override public void run() { uiHandler.post(new Runnable() { @Override public void run() { } }); } ; }, 0L, 10L * 1000); // интервал - 10000 миллисекунд, 0 миллисекунд до первого запуска. 

ACTUALIZADO

Tengo un error en este código:

 Timer myTimer = new Timer(); final Handler uiHandler = new Handler(); myTimer.schedule(new TimerTask() { @Override public void run() { while (songRefreshing) { uiHandler.post(new Runnable() { @Override public void run() { try { HttpClient httpclient = new DefaultHttpClient(); HttpResponse response = null; response = httpclient.execute(new HttpGet(Const.php_url)); StatusLine statusLine = response.getStatusLine(); if (statusLine.getStatusCode() == HttpStatus.SC_OK) { ByteArrayOutputStream out = new ByteArrayOutputStream(); response.getEntity().writeTo(out); out.close(); String responseString = out.toString(); if (app.getCurSong() == null || app.getCurSong().intern() != responseString.intern()) { app.setCurSong(responseString); song_name.setText(app.getCurSong()); Log.d(LOG_TAG, "refreshCurSung - " + responseString); } } else { response.getEntity().getContent().close(); throw new IOException(statusLine.getReasonPhrase()); } } catch (IOException e) { e.printStackTrace(); Log.d(LOG_TAG, e.toString()); } } }); } } ; }, 0L, 10L * 1000); // 10s interval 

Error:

 android.os.NetworkOnMainThreadException at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1178) at java.net.InetAddress.lookupHostByName(InetAddress.java:394) at java.net.InetAddress.getAllByNameImpl(InetAddress.java:245) at java.net.InetAddress.getAllByName(InetAddress.java:220) at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137) at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:590) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:510) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:488) 

¿Significa que TimerTask no se ejecuta en un nuevo subproceso?

Para responder a su pregunta directamente, una cita tomada de aquí :

Descripción de la Clase

Los temporizadores programan tareas de un solo disparo o recurrentes para su ejecución. Prefiera ScheduledThreadPoolExecutor para el nuevo código.

Cada temporizador tiene un subproceso en el que las tareas se ejecutan secuencialmente. Cuando este hilo está ocupado ejecutando una tarea, las tareas ejecutables pueden estar sujetas a retrasos.

Se prevé que el disparo único se ejecute en un tiempo absoluto o después de un retraso relativo.

Las tareas periódicas se programan con un período fijo o una tasa fija:

Con la ejecución por defecto de período fijo, cada ejecución sucesiva de una tarea se programa con respecto a la hora de inicio de la ejecución anterior, por lo que dos ejecuciones nunca se disparan más juntas en tiempo que el período especificado. Con la ejecución de tasa fija, la hora de inicio de cada ejecución sucesiva de una tarea se programa sin tener en cuenta cuándo se realizó la ejecución anterior. Esto puede resultar en una serie de corridas agrupadas (una puesta en marcha inmediatamente después de otra) si los retrasos impiden que el temporizador comience las tareas a tiempo. Cuando un temporizador ya no es necesario, los usuarios deben llamar a cancel (), que libera el hilo del temporizador y otros recursos. Los temporizadores no cancelados explícitamente pueden tener recursos indefinidamente.

Esta clase no ofrece garantías sobre la naturaleza en tiempo real de la programación de tareas. Múltiples hilos pueden compartir un solo temporizador sin sincronización.

Así que sí, es un hilo.

UPDATE (después de la actualización de la pregunta):

La implementación actual podría contener muchos defectos, por eso te recomendaría que Runnable el código del Runnable en un AsyncTask (y AsyncTask todo el montón de código en el método doInBackground ). Allí se puede controlar fácilmente.

Además, pienso que @Overriding el run() dos veces uno dentro de otro podría llevarle a un punto muerto o algo. Dado que el TimerTask es de hecho un hilo, entonces no creo que necesite un Runnable separado dentro de él.

Quite la ejecución del Runnable para un comienzo e intente lanzar el TimerTask con el HttpClient dentro de él (sin Runnable ). Si no logra hacerlo, ponga el código (como se sugiere) en un AsyncTask (tendrá una implementación más bonita como esta de todos modos).

Gracias

  • Intentar invocar método virtual
  • Temporizador La tarea deja de ejecutarse después de un tiempo indefinido en android
  • Cómo ejecutar la tarea Async repetidamente después de intervalos de tiempo fijos
  • Detener temporizador sin destruir y volver a crear - Android
  • ¿Dónde puedo crear y usar ScheduledThreadPoolExecutor, TimerTask o Handler?
  • Android no puede crear el controlador dentro del subproceso que no ha llamado looper.prepare ()
  • Cómo pausar y reanudar un TimerTask / Timer
  • Inicie Android Service cada 5 minutos
  • ¿Cuál es el mejor método para ejecutar una tarea repetidamente en android? (Ej .: - Actualización de puntajes, Actualización Ui)
  • Visibilidad de ImageView Error con temporizador
  • Cómo detener un temporizador después de cierto número de veces
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.