Jump to content

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

Link to comment
Share on other 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...

Link to comment
Share on other 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 ???

Link to comment
Share on other 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 !)

Link to comment
Share on other 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é

Link to comment
Share on other 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)

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...