Comment puis-je exécuter du code sur un thread d'arrière-plan sur Android?
Je veux un code de s'exécuter en arrière-plan en permanence. Je ne veux pas le faire dans un service. Est-il un autre moyen possible?
J'ai essayé d'appeler le Thread
classe dans mon Activity
mais mon Activity
reste en arrière-plan pour un certain temps et puis il s'arrête. Le Thread
classe également les arrêts de travail.
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
}
- Salut. Pouvez-vous s'il vous plaît poster un code comme un exemple de ce que vous avez essayé? Il y a différentes façons d'exécuter du code sur un thread d'arrière-plan, mais vous devez vous rappeler si vous accédez à tous les composants de l'INTERFACE utilisateur, vous devez accéder sur le thread d'INTERFACE utilisateur à l'aide de la
runOnUiThread()
méthode. - Est-il une raison particulière pour ne pas utiliser le Service
- ce n'est pas tellement recommandé. l'exécution continue permet de drain de batterie de l'appareil.
- J'ai envoyer le code.
- J'ai essayé de l'utiliser dans le service, mais son envoi le même rendu plusieurs fois.
- Je suis d'accord il draine la batterie, mais besoin de le faire. comme je veux envoyer des données en continu.
Vous devez vous connecter pour publier un commentaire.
SI vous avez besoin de:
d'exécuter du code sur un Thread d'arrière-plan
exécuter du code qui NE touche PAS/mise à jour de l'INTERFACE utilisateur
execute (court) code qui prendra tout au plus quelques secondes
PUIS utilisez la commande suivante propres et efficaces modèle qui utilise AsyncTask:
Souviens en cours d'Exécution de Fond, Fonctionnant en permanence, sont deux tâches différentes.
À long terme de processus d'arrière-plan, les Threads ne sont pas optimales pour Android. Cependant, voici le code et de le faire à vos risques et périls...
Souviens de Service ou d'un Thread sera exécuté en arrière-plan, mais notre tâche a besoin de faire de déclenchement (appel encore et encore) pour obtenir les mises à jour, c'est à dire une fois que la tâche est terminée, nous devons rappeler la fonction pour la prochaine mise à jour.
Minuterie (périodique de déclenchement), Alarme (base de temps de déclenchement), de Diffusion (Cas de la base de Déclenchement), la récursivité va se réveiller nos fonctions.
À L'Aide De Service:
Si vous lancez un Service qu'il démarre, Il exécute la tâche, et il prendra fin en soi. après l'exécution de la tâche. résiliation peut également être provoquée par exception, ou de l'utilisateur tué manuellement à partir de paramètres.
START_STICKY (Collant Service) est la possibilité donnée par android que le redémarrage du service lui-même si le service est arrêté.
Souviens de la question différence entre le multitraitement et le multiprocessus?
Le Service est un processus d'arrière-plan (tout comme l'activité sans INTERFACE utilisateur),
De la même façon le mode de lancement de fil de l'activité pour éviter la charge sur le thread principal (Activité thread), de la même manière que vous avez besoin pour lancer des threads(ou asynchrone des tâches) sur le service afin d'éviter la charge sur le service.
Dans un seul énoncé, si vous voulez une course de fond continue tâche, vous avez besoin de lancer un StickyService et exécuter le fil dans le service, le cas de la base de
Plus susceptibles mechanizm que vous cherchez est
AsyncTask
. Directement désigné pour l'exécution de processus d'arrière-plan sur le Thread d'arrière-plan. Aussi son principal avantage est qu'il offre quelques méthodes qui fonctionnent à Main(UI) de Thread et de rendre possible la mise à jour de votre INTERFACE utilisateur si vous voulez annoncer l'utilisateur à propos de certains progrès dans la tâche ou de la mise à jour de l'INTERFACE utilisateur avec les données récupérées à partir de processus d'arrière-plan.Si vous ne savez pas comment commencer ici est agréable tutoriel:
Pour toujours
Remarque: il y a Aussi possibilité d'utiliser
IntentService
avecResultReceiver
qui fonctionne aussi bien.Une Alternative à l'AsyncTask est robospice. https://github.com/octo-online/robospice.
Certaines des caractéristiques de robospice.
1.s'exécute de façon asynchrone (dans un contexte AndroidService) les demandes de réseau (ex: RESTE demandes à l'aide de Printemps Android).vous notifie de l'application, sur le thread de l'INTERFACE utilisateur, si le résultat est prêt.
2.est fortement typé ! Vous faites vos demandes à l'aide de Pojo et vous obtenez Pojo que les résultats d'une requête.
3.appliquer, pas de contraintes ni sur Pojo utilisé pour les demandes, ni sur l'Activité de classes que vous utilisez dans vos projets.
4.les caches des résultats (en Json avec Jackson et Gson, ou Xml, ou à plat des fichiers texte ou des fichiers binaires, même à l'aide de l'ORM Lite).
5.informe de vos activités (ou de tout autre contexte) de la suite de la demande du réseau si et seulement si ils sont encore en vie
6.pas de fuite de mémoire à tous, comme Android Chargeurs, contrairement à Android AsyncTasks informe de vos activités sur leur Thread d'INTERFACE utilisateur.
7.utilise un simple mais robuste de gestion des exceptions modèle.
Échantillons pour commencer. https://github.com/octo-online/RoboSpice-samples.
Un échantillon de robospice à https://play.google.com/store/apps/details?id=com.octo.android.robospice.motivations&feature=search_result.
Si vous avez besoin d'exécuter le thread predioticly avec différents codes ici est un exemple:
Auditeur:
Classe Thread
Exécuter des codes différents: