Comment puis-je exécuter du code sur un thread d’arrière-plan sur Android?

Je veux que du code fonctionne en permanence en arrière-plan. Je ne veux pas le faire dans un service. Y a-t-il une autre voie possible?

J’ai essayé d’appeler la classe Thread dans mon Activity mais mon Activity rest en arrière-plan pendant un certain temps, puis elle s’arrête. La classe Thread cesse également de fonctionner.

 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(); } //Ssortingng line =null; while (true) { HttpEntity entity=null; try { if (isInternetOn()) { while ((line = in.readLine()) != null) { HttpClient client = new DefaultHttpClient(); Ssortingng url = "some url"; HttpPost request = new HttpPost(url); SsortingngEntity se = new SsortingngEntity(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 tu as besoin de:

  1. exécuter du code sur un fond Thread

  2. exécuter du code qui ne touche / met à jour l’interface utilisateur

  3. exécuter un code (court) qui prendra au plus quelques secondes pour se terminer

Ensuite, utilisez le modèle propre et efficace suivant qui utilise AsyncTask:

 AsyncTask.execute(new Runnable() { @Override public void run() { //TODO your background code } }); 

Pour les processus d’arrière-plan à long terme, les threads ne sont pas optimaux avec Android. Cependant, voici le code et faites-le à vos risques et périls …

Rappelez-vous que le service ou le thread s’exécutera en arrière-plan, mais que notre tâche doit déclencher (appeler encore et encore) pour obtenir les mises à jour, c.-à-d.

Minuterie (déclenchement périodique), Alarme (Déclencheur de base de temps), Diffusion (Déclencheur de base d’événement), la récursivité réveillera nos fonctions.

 public static boolean isRecursionEnable = true; void runInBackground() { if (!isRecursionEnable) return; // Handle not to start multiple parallel threads // isRecursionEnable = false; when u want to stop // 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(); } 

Je veux que du code fonctionne en permanence en arrière-plan. Je ne veux pas le faire dans un service. Y a-t-il une autre voie possible?

Le AsyncTask plus probable que vous recherchez est AsyncTask . Il directement désigné pour effectuer un processus d’arrière-plan sur le fil d’arrière-plan. En outre, son principal avantage est qu’il offre quelques méthodes qui s’exécutent sur Thread principal (UI) et permettent de mettre à jour votre interface utilisateur si vous souhaitez informer l’utilisateur d’une progression dans une tâche ou mettre à jour l’interface utilisateur avec des données extraites.

Si vous ne savez pas comment démarrer, voici un bon tutoriel:

  • Comprendre AsyncTask – Une fois pour toutes

Remarque: Il est également possible d’utiliser IntentService avec ResultReceiver qui fonctionne également.

Une alternative à AsyncTask est le robospice. https://github.com/octo-online/robospice .

Quelques caractéristiques du robospice.

1.exécute de manière asynchrone (dans un fond AndroidService) des requêtes réseau (ex: requêtes REST utilisant Spring Android) .notifiez votre application, sur le thread d’interface utilisateur, lorsque le résultat est prêt.

2. est fortement typé! Vous faites vos demandes en utilisant des POJO et vous obtenez des POJO comme résultats de demande.

3. N’appliquez aucune contrainte sur les POJO utilisés pour les demandes ni sur les classes d’activité que vous utilisez dans vos projets.

4.caches résultats (dans Json avec à la fois Jackson et Gson, ou XML, ou des fichiers de texte plat, ou des fichiers binarys, même en utilisant ORM Lite).

5.notifie vos activités (ou tout autre contexte) du résultat de la requête réseau si et seulement si elles sont toujours en vie

6. pas de fuite de mémoire du tout, comme les chargeurs Android, contrairement à Android AsyncTasks notifie vos activités sur leur thread d’interface utilisateur.

7. utilise un modèle de gestion des exceptions simple mais robuste.

Échantillons pour commencer https://github.com/octo-online/RoboSpice-samples .

Un exemple de robospice à l’ adresse https://play.google.com/store/apps/details?id=com.octo.android.robospice.motivations&feature=search_result .

 class Background implements Runnable { private CountDownLatch latch = new CountDownLatch(1); private Handler handler; Background() { Thread thread = new Thread(this); thread.start(); try { latch.await(); } catch (InterruptedException e) { /// e.printStackTrace(); } } @Override public void run() { Looper.prepare(); handler = new Handler(); latch.countDown(); Looper.loop(); } public Handler getHandler() { return handler; } }