¿Cómo puedo ejecutar código en un hilo de fondo en Android?
Quiero que se ejecute un código en el fondo continuamente. No quiero hacerlo en un servicio. ¿Hay alguna otra manera posible?
He intentado llamar a la clase Thread
en mi Activity
pero mi Activity
permanece en segundo plano durante algún tiempo y luego se detiene. La clase Thread
también deja de funcionar.
- Cómo crear un hilo en Android NDK?
- ¿Hay RxJava equivalente a Handler.postDelayed (Runnable r, delayMillis largo)
- Dormir un hilo hasta que un evento sea asistido en otro hilo
- runOnUiThread no se está ejecutando en AsyncTask
- Android wait asynctask para terminar
class testThread implements Runnable { @Override public void run() { File file = new File(Environment.getExternalStorageDirectory(),"/BPCLTracker/gpsdata.txt"); int i=0; RandomAccessFile in = null; try { in = new RandomAccessFile(file, "rw"); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } //String line =null; while (true) { HttpEntity entity=null; try { if (isInternetOn()) { while ((line = in.readLine()) != null) { HttpClient client = new DefaultHttpClient(); String url = "some url"; HttpPost request = new HttpPost(url); StringEntity se = new StringEntity(line); se.setContentEncoding("UTF-8"); se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json")); entity = se; request.setEntity(entity); HttpResponse response = client.execute(request); entity = response.getEntity(); i++; } if((line = in.readLine()) == null && entity!=null) { file.delete(); testThread t = new testThread(); Thread t1 = new Thread(t); t1.start(); } }// end of if else { Thread.sleep(60000); } // end of else }// end of try catch (NullPointerException e1) { e1.printStackTrace(); } catch (InterruptedException e2) { e2.printStackTrace(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } }// end of while }// end of run
- diferencia runable androide
- Notificando un solo hilo: notify, notifyAll o concurrent.locks.Condition?
- ¿Debo usar setDaemon () en android?
- Los anuncios de Android ralentizan mucho el rendimiento
- ¿Puede alguien explicar por favor cómo startActivity (intención) y startActivityForResult (intención) son asíncronos?
- Cómo comprobar si el hilo actual no es el hilo principal
- Cómo comprobar si se ejecuta en el hilo de la interfaz de usuario en Android?
- Detener una ejecución en un hilo independiente
Si lo necesitas:
-
Ejecutar código en un fondo
-
Ejecutar código que no toque / actualizar la interfaz de usuario
-
Ejecutar código (corto) que tardará como máximo unos segundos en completarse
ENTONCES utilice el siguiente patrón limpio y eficiente que utiliza AsyncTask:
AsyncTask.execute(new Runnable() { @Override public void run() { //TODO your background code } });
Para procesos de fondo a largo plazo, los hilos no son óptimos con Android. Sin embargo, aquí está el código y hacerlo a su propio riesgo …
Recuerde que el servicio o el hilo se ejecutará en segundo plano, pero nuestra tarea necesita hacer que el disparador (llamar de nuevo y de nuevo) para obtener actualizaciones, es decir, una vez que la tarea se ha completado necesitamos recordar la función para la próxima actualización.
Temporizador (gatillo periódico), alarma (disparador de base de tiempo), difusión (desencadenador de base de eventos), recursión despertará nuestras funciones.
public static boolean isRecursionEnable = false; void runInBackground() { if (isRecursionEnable) return; // Handle not to start multiple parallel threads isRecursionEnable = true; // on exception on thread make it true again new Thread(new Runnable() { @Override public void run() { // DO your work here // get the data if (activity_is_not_in_background) { runOnUiThread(new Runnable() { @Override public void run() { //uddate UI runInBackground(); } }); } else { runInBackground(); } } }).start(); }
Quiero que se ejecute un código en el fondo continuamente. No quiero hacerlo en un servicio. ¿Hay alguna otra manera posible?
Lo más probable es que AsyncTask
que usted está buscando es AsyncTask
. Se designa directamente para realizar el proceso de fondo en el hilo de fondo. También su principal beneficio es que ofrece unos pocos métodos que se ejecutan en el hilo principal (UI) y hacer posible actualizar su interfaz de usuario si desea anunciar al usuario acerca de algún progreso en la tarea o actualizar la interfaz de usuario con los datos recuperados de proceso en segundo plano.
Si no sabes cómo empezar aquí es un buen tutorial:
- Entendiendo AsyncTask – Una vez y para siempre
Nota: También existe la posibilidad de utilizar IntentService
con ResultReceiver
que funciona también.
Una alternativa a AsyncTask es robospice. https://github.com/octo-online/robospice .
Algunas de las características de robospice.
1.executa de forma asincrónica (en un fondo AndroidService) las solicitudes de red (por ejemplo, las solicitudes REST que utilizan Spring Android) .notifique su aplicación, en el hilo de la interfaz de usuario, cuando el resultado esté listo.
2. está fuertemente mecanografiado! Usted hace sus peticiones usando POJOs y obtiene POJOs como resultados de la solicitud.
3.enforce no hay restricciones ni en POJOs utilizados para las solicitudes ni en las clases de actividad que utiliza en sus proyectos.
4.caches resultados (en Json con Jackson y Gson, o Xml, o archivos de texto planos, o archivos binarios, incluso utilizando ORM Lite).
5.notifica sus actividades (o cualquier otro contexto) del resultado de la solicitud de red si y sólo si siguen vivas
6.no hay pérdida de memoria en absoluto, como Android Loaders, a diferencia de Android AsyncTasks notifica sus actividades en su interfaz de usuario.
7.usa un modelo de manejo de excepciones sencillo pero robusto.
Muestras para empezar. https://github.com/octo-online/RoboSpice-samples .
Una muestra de robospice en https://play.google.com/store/apps/details?id=com.octo.android.robospice.motivations&feature=search_result .
- Error: no se puede encontrar la variable de símbolo abc_ic_ab_back_mtrl_am_alpha
- Cómo mover el contenido principal con el lado izquierdo del diseño de cajones