¿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.

 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 

Si lo necesitas:

  1. Ejecutar código en un fondo

  2. Ejecutar código que no toque / actualizar la interfaz de usuario

  3. 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 .

  • Cómo y reiniciar el hilo de nuevo en la actividad creada
  • ¿Cuál es la causa de los picos de rendimiento periódicos que se ven al hacer el procesamiento de matriz de computación caro en el Nexus 4?
  • Java.lang.Thread.setPriority vs android.os.Process.setThreadPriority
  • Cómo evitar la señal fatal 6 (SIGABRT) en android
  • ¿Es seguro usar Java Threads de la misma manera que las aplicaciones de escritorio?
  • RxAndroid: cambios de interfaz de usuario en el subproceso Schedulers.io ()
  • Android esperando el hilo de la interfaz de usuario
  • Afinidad de hilo para Android
  • Mi clase AsyncTask tiene otros subprocesos en él. ¿Cómo puedo esperar a que termine con todos sus subprocesos antes de ejecutar un método siguiente?
  • Cómo devolver un valor de hilo en java?
  • Android Thread.sleep a veces espera demasiado tiempo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.