Aller au contenu

Thread et appel à un serveur distant


Whirpett

Recommended Posts

Bonjour,

Je vais essayer d'expliquer clairement mon problème.

Je réalise une application qui vérifie si de nouvelles demande de clients on été effectué en checkant un serveur régulièrement.

Si une nouvelle demande est passée, alors on déclenche une notification.

Petit détail, je veux effectuer cette vérification que lorsque l'application n'est pas visible au premier plan (car bien sur lorsqu'elle est au premier plan les infos, sont directement visible).

C'est pourquoi je me suis servi du tuto des différents cycle de vie d'une appli.

public class accueil extends TabActivity{

private boolean stop;

public void onCreate(Bundle savedInstanceState) {

stop = false;

super.onCreate(savedInstanceState);

setContentView(R.layout.accueil);

notif();

}

public void notif()

{

new Thread(new Runnable() {

public void run() {

while(stop)

{

final String adresseIp = "127.0.0.1";

aClassConnexion test = new aClassConnexion(adresseIp);

String Texte = test.dlPage("/REPAR'AUTO/ANDROID/transfert.php?id=admin&mdp=ADMIN");

// Si il y a au moins une demande on affiche une notification

int i = Integer.parseInt(Texte);

if(i>0)

{

test(i);

}

else

{

// Sinon on supprime les notifications

notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

notificationManager.cancel(1);

}

try

{

Thread.sleep(2000);

} catch (InterruptedException e) {e.printStackTrace();}

}

}

}).start();

}

public void test(int nombre)

{

notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

// 1ère affichage de la notification

Notification notification = new Notification(R.drawable.test, "Nouvelle demande", System.currentTimeMillis());

// on créer une intent vers l'appli

Intent intentNotif = new Intent(getBaseContext(), accueil.class);

// Puis on l'associe lors du clic sur la notif

PendingIntent pendingIntent = PendingIntent.getActivity(accueil.this, 0, intentNotif, 0);

notification.setLatestEventInfo(accueil.this, "Accéder à l'application", "Nombre de demandes : "+nombre, pendingIntent);

// Supprime la notification lors de l'appui sur celui-ci

notification.flags |= Notification.FLAG_AUTO_CANCEL;

// vibration

notification.defaults |= Notification.DEFAULT_VIBRATE;

// sonnerie

//notification.defaults |= Notification.DEFAULT_SOUND;

// affichage

notificationManager.notify(1, notification);

}

/*

@Override

protected void onPause() {

// TODO Auto-generated method stub

super.onPause();

flag = 0;

notif();

}

@Override

public void finish() {

// TODO Auto-generated method stub

super.finish();

}

*/

protected void onPause() {

// TODO Auto-generated method stub

super.onPause();

stop = true;

//notif();

//flag = 0;

//notif();

}

protected void onResume() {

super.onResume();

stop = false;

//notif();

}

protected void onRestart() {

super.onResume();

stop = false;

//notif();

}

}

Donc lorsque je suis sur l'appli, aucune notification pas de problème. Lorsque j'appui sur le bouton home, la les notifications se déclenche, mais lorsque je suit le lien vers mon application (present sur la notif) et bien les notifications ne s'arrête pas.

Je ne vois pas ou est le problème (je pense qu'il vient du thread, mais bon ...)

Si quelqu'un pense m'aider, merci

Lien vers le commentaire
Partager sur d’autres sites

Les traitements d'arrière-plan tel que ta vérification sont à implémenter au travers d'un Service (doc), indépendant de l'IHM et d'une quelconque Activity, dont on ne maîtrise pas le cycle de vie

PS: utilise les balise [ code ] / [ /code ] dans tes posts quand tu y mets des extraits de code, ça sera plus lisible...

Lien vers le commentaire
Partager sur d’autres sites

J'ai continuer a fouiller un peu, et j'ai compris ou se trouvait le problème avec les services (je l'avais mal déclarer dans le manifest).

Donc j'ai bien une méthode pour le onStart et le onStop :

public class ExampleService extends Service
{
private NotificationManager notificationManager;

// Quand le service est créé
public void onCreate()
{
	Toast.makeText(getBaseContext(), "Start Service", Toast.LENGTH_SHORT).show();
}

public void onStart(Intent intent, int startId)
{
	 new Thread(new Runnable() {
	    	public void run() {
		    	while(true)
		    	{
		    		/*
		    		final String adresseIp = "192.168.1.14";
		    		aClassConnexion test = new aClassConnexion(adresseIp);
		    		String Texte = test.dlPage("/REPAR'AUTO/ANDROID/transfert.php?id=PERAUDEAU&mdp=0");
		    		// Si il y a au moins une demande on affiche une notification
		    		int i = Integer.parseInt(Texte); 		
		    		*/
		    		int i= 1;

			    	if(i>0)
			    	{
			    	   test(i);
			    	}
			    	else
			    	{
			    	   // Sinon on supprime les notifications
			    	   notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
			    	   notificationManager.cancel(1);
			    	}  	
			    	try 
		    		{
		    			Thread.sleep(2000);
					} catch (InterruptedException e) {e.printStackTrace();}
		    	}
		    }
        }).start(); 
}

public void onDestroy() 
{
	Toast.makeText(getBaseContext(), "Stop Service", Toast.LENGTH_SHORT).show();
	Thread.currentThread().stop();
}
}

DOnc je démarre mon service sur le onStop() de l'activité et je l'arrête sur le onResume() de cette même activité.

Mais je n'arrive pas à stopper mon service ( et donc killer mon thread), vois tu comment faire ???

Lien vers le commentaire
Partager sur d’autres sites

Garde une référence sur le thread que tu lances, sinon tu ne risques pas de pouvoir l'arrêter (actuellement, tu essayes d'arrêter le thread courant, ie le thread UI : pas bon !)

Lien vers le commentaire
Partager sur d’autres sites

Salut,

J'ai finalement résolu mon problème en remplaçant le true de la boucle par un booleen dont je change la valeur quand je doit l'arrêter.

J'ai essayer en mettant mon string en variable de classe, et en utilisant la méthode stop(), mais sa nefonctionne pas ( méthode dépreciée ).

Merci de m'avoir aidé

Lien vers le commentaire
Partager sur d’autres sites

Il ne faut pas utiliser effectivement la méthode stop(), mais la méthode interrupt(), pour demander l'arrêt d'un thread (et tester dans la boucle du thread avec la méthode isInterrupted() pour savoir si une demande d'arrêt du thread a été faite)

Lien vers le commentaire
Partager sur d’autres sites

Rejoignez la conversation

Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.

Invité
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • Créer...