Je veux que du code s'exécute en arrière-plan en continu. Je ne veux pas le faire dans un service. Y a-t-il un autre moyen possible?
J'ai essayé d'appeler la Thread
classe dans mon Activity
mais mon Activity
reste en arrière-plan pendant un certain temps, puis il s'arrête. La Thread
classe 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();
}
//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();
}
} else {
Thread.sleep( 60000 );
} // end of else
} 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
}
android
multithreading
user2082987
la source
la source
runOnUiThread()
méthode.Réponses:
Si tu as besoin de:
exécuter du code sur un thread d'arrière-plan
exécuter du code qui NE touche PAS / ne met pas à jour l'interface utilisateur
exécuter un code (court) qui prendra au plus quelques secondes pour se terminer
ALORS utilisez le modèle propre et efficace suivant qui utilise AsyncTask:
la source
Rappelez-vous Running Background, Running continuellement sont deux tâches différentes.
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 ...
N'oubliez pas que le service ou le thread s'exécutera en arrière-plan, mais notre tâche doit déclencher (appeler encore et encore) pour obtenir les mises à jour, c'est-à-dire qu'une fois la tâche terminée, nous devons rappeler la fonction pour la prochaine mise à jour.
Timer (déclenchement périodique), alarme (déclenchement de base de temps), diffusion (déclenchement de base d'événement), la récursivité réveillera nos fonctions.
Utilisation du service: Si vous lancez un service, il démarrera, il exécutera la tâche et se terminera de lui-même. après l'exécution de la tâche. résilié peut également être causé par une exception, ou l'utilisateur l'a tué manuellement à partir des paramètres. START_STICKY (Sticky Service) est l'option donnée par Android selon laquelle le service redémarrera lui-même si le service est interrompu.
Rappelez-vous la différence de question entre le multitraitement et le multithreading? Le service est un processus d'arrière-plan (tout comme l'activité sans interface utilisateur), de la même manière que vous lancez le thread dans l'activité pour éviter la charge sur le thread principal (thread d'activité), de la même manière que vous devez lancer des threads (ou des tâches asynchrones) sur le service pour éviter la charge sur le service.
En une seule instruction, si vous souhaitez exécuter une tâche en arrière-plan, vous devez lancer un StickyService et exécuter le thread dans le service sur la base des événements.
la source
Le mécanisme le plus probable que vous recherchez est
AsyncTask
. Il est directement désigné pour effectuer le processus d'arrière-plan sur le fil d'arrière-plan. Son principal avantage est également qu'il offre quelques méthodes qui s'exécutent sur le fil principal (UI) et permettent de mettre à jour votre interface utilisateur si vous souhaitez annoncer à l'utilisateur la progression de la tâche ou mettre à jour l'interface utilisateur avec des données récupérées à partir du processus d'arrière-plan.Si vous ne savez pas par où commencer, voici un joli tutoriel:
Remarque: il est également possible d'utiliser
IntentService
avecResultReceiver
cela fonctionne également.la source
Simple 3-Liner
Une façon simple de faire cela que j'ai trouvée dans un commentaire de @awardak dans la réponse de Brandon Rude :
Je ne sais pas si, ni comment, c'est mieux que d'utiliser,
AsyncTask.execute
mais cela semble fonctionner pour nous. Tout commentaire sur la différence serait apprécié.Merci, @awardak !
la source
Une alternative à AsyncTask est robospice. https://github.com/octo-online/robospice .
Certaines des fonctionnalités de robospice.
1. exécute de manière asynchrone (dans un AndroidService en arrière-plan) des requêtes réseau (ex: requêtes REST à l'aide de Spring Android) .notifiez votre application, sur le thread de l'interface utilisateur, lorsque le résultat est prêt.
2. est fortement typé! Vous faites vos demandes à l'aide de POJO et vous obtenez des POJO comme résultats de demande.
3. n'appliquez aucune contrainte ni aux POJO utilisés pour les requêtes, ni aux classes d'activité que vous utilisez dans vos projets.
4. met en cache les résultats (dans Json avec Jackson et Gson, ou Xml, ou des fichiers texte plats, ou des fichiers binaires, 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 actives
6.pas de fuite de mémoire du tout, comme les chargeurs Android, contrairement à Android AsyncTasks notifie vos activités sur leur fil d'interface utilisateur.
7. utilise un modèle de gestion des exceptions simple mais robuste.
Des échantillons pour commencer. https://github.com/octo-online/RoboSpice-samples .
Un échantillon de robospice sur https://play.google.com/store/apps/details?id=com.octo.android.robospice.motivations&feature=search_result .
la source
la source
Si vous avez besoin d'exécuter un thread predioticly avec différents codes, voici un exemple:
Auditeur:
Classe de fil
Exécutez différents codes:
la source