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?

One Solution collect form web for “Hace TimerTask ejecutando en nuevo hilo”

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

  • Java - Timer.cancel () v / s TimerTask.cancel ()
  • Android: Acceso al elemento de interfaz de usuario desde el subproceso del temporizador
  • Cómo detener un temporizador después de cierto número de veces
  • Temporizador La tarea deja de ejecutarse después de un tiempo indefinido en android
  • Android no puede crear el controlador dentro del subproceso que no ha llamado looper.prepare ()
  • Cómo llamar a onUpdate () en AppWidgetProvider?
  • Lanzar null pointerException en Timer.Schedule ();
  • Inicie Android Service cada 5 minutos
  • ¿Dónde puedo crear y usar ScheduledThreadPoolExecutor, TimerTask o Handler?
  • Tarea del temporizador VS Uso del administrador de alarmas en el servicio de Android
  • Timertask o manejador
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.