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
- Cómo determinar si la tarea del temporizador ha finalizado
- Timer.scheduleAtFixedRate no se detiene cuando llamo cancelar
- TimerTask ya está programado
- Lanzar null pointerException en Timer.Schedule ();
- ¿Cómo puedo implementar un Timer / TimerTask que ejecuta un AsyncTask? (Androide)
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?
- Android - Cómo detener y detener el temporizador
- Obtención de metadatos de SHOUTcast utilizando IcyStreamMeta
- Cómo llamar a onUpdate () en AppWidgetProvider?
- El temporizador Android llega tarde cuando la pantalla del teléfono está bloqueada
- Timertask o manejador
- Java - Timer.cancel () v / s TimerTask.cancel ()
- TimerTask vs Thread.sleep vs Handler postDelayed - más preciso para llamar a la función cada N milisegundos?
- Android: Acceso al elemento de interfaz de usuario desde el subproceso del temporizador
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
- ¿Cómo puedo ajustar un número exacto de elementos ListView en la pantalla?
- Cómo establecer el listener de ontouch para algo dibujado con lienzo: Android