Aller au contenu

Problème de focus


m.borghesi

Recommended Posts

Salut à tous,

Voila je rencontre un problème dans l'application que je développe :

A l'ouverture de mon application l'utilisateur à la possibilité de cliquer sur trois boutons. Lorsqu'il clic sur un de ces boutons, cela ouvre un autre application (via un intent) dont je ne suis pas l'auteur (comprenez que je n'ai pas accès aux sources).

Une fois que cette autre application est ouverte ma propre application fais une boucle (mais attention l'application "au premier plan" est celle dont je ne suis pas l'auteur).

J'aimerais tous simplement que lorsque je clic sur le bouton retour la boucle puisse s'arrêter!

Je le répète je n'ai pas accès aux sources de l'autre application et je ne peux donc pas coder quelque chose sur le onBackPressed.

Mon idée était de passer par le focus des fenêtres mais la encore je rencontre un problème... en effet, le onWindowFocusChanged() ou même le hasWindowFocus() ne s'éxectuent qu'une fois tous ce qui est présent dans le onClick() est terminé! Du coup ma condition pour sortir de la boucle n'est jamais vrai! (J'espère ne pas vous avoir perdu...).

Je vous met mon dernier bout de code :

public void onClick(View v) {

if (v == boutonContinuer)

{

/* ouverture automatique du client RDP */

Intent intent = new Intent();

intent.setComponent(new ComponentName("org.toremote.rdpdemo","org.toremote.rdpdemo.ServersList"));

startActivity(intent);

for (int i = 0; i < 10; ++i)

{

if (hasWindowFocus())

// une action

else

break;

}

}

} // OnClick()

HELP :P

merci d'avance :)

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

Normalement, Android gère nativement cette interaction : si ton activité lance une application et que l'utilisateur quitte cette application, via le bouton back, il devrait automatiquement revenir dans ton activité.

De plus, il me semble que startActivity est une méthode synchrone donc, à mon avis, ta boucle for n'est jamais parcourue. D'ailleurs je n'ai pas compris l'intérêt de cette boucle.

Bon courage,

ichpa

Lien vers le commentaire
Partager sur d’autres sites

Oui c'est bien ça.

En cliquant sur le bouton back le téléphone revient bien sur mon activité mais la boucle continue de s'exécuter (c'est en fait une boucle qui tente i fois de se connecter à un serveur) ce qui entrain le figeage de mon application. Ce que je voudrais c'est que lorsque l'utilisateur revient en arrière l'application arrête le traitement de ma boucle.

Non, apparemment startActivity n'est pas synchrone, j'ai mis en place des logs qui me permettent de voir que ma boucle s'exécute bien...

Lien vers le commentaire
Partager sur d’autres sites

Merci pour l'info sur le startActivity.

Cependant, plusieurs remarques sur ton implémentation :

- L'exécution de code "métier" dans la thread de l'interface graphique (comme tu le fais) est à éviter car cela risque de ralentir ton application voir de la planter si le traitement dure plus de 5 secondes. Il faut donc utiliser les outils adaptés en fonction de ton besoin (couple Thread/Handler, AsyncTask, Service, ...) ;

- il faut faire attention au cycle de vie d'une Activity (onCreate, onStart, onResume puis onPause, onStop, onDestroy). Lorsque ton Activity est quittée la méthode onPause est lancée (gèle de l'Activity) et lorsqu'elle revient au premier plan c'est onResume qui est lancée. Ton implémentation doit donc, de préférence, reposer sur ces méthodes natives.

En gros, dans ton cas, je lancerai un service avant l'appel à startActivity puis je l'arrêterais dans la méthode onResume de ton activité.

Lien vers le commentaire
Partager sur d’autres sites

D'abord merci pour tes réponses claires.

La solution que tu me propose est pas la bonne dans mon cas puisque, si je ne dis pas de bêtises, un service s'exécute toujours en "background" et donc l'utilisateur ne peut pas interagir avec l'application que je lance depuis mon application.

Qu'en penses tu?

Lien vers le commentaire
Partager sur d’autres sites

J'ai choisi de passer par les Threads, mais maintenant j'obtiens une erreur que je ne comprend pas vraiment...

Une fois dans mon thread je n'arrive plus à lancer une action dans mon activité principale...

voici les erreurs que j'ai :

10-26 15:40:11.916: ERROR/AndroidRuntime(3993): Uncaught handler: thread Thread-8 exiting due to uncaught exception
10-26 15:40:11.926: ERROR/AndroidRuntime(3993): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
10-26 15:40:11.926: ERROR/AndroidRuntime(3993):     at android.os.Handler.(Handler.java:121)
10-26 15:40:11.926: ERROR/AndroidRuntime(3993):     at android.widget.Toast.(Toast.java:68)
10-26 15:40:11.926: ERROR/AndroidRuntime(3993):     at android.widget.Toast.makeText(Toast.java:231)

cela intervient lorsque j'utilise ce morceau de code :

public void onClick(View v) {

       if (v == boutonContinuer)
       {
           Thread monThread = new Thread (){

           @Override
           public void run() {

           /* ouverture automatique du client RDP */
           Intent intent = new Intent();
           intent.setComponent(new ComponentName("org.toremote.rdpdemo","org.toremote.rdpdemo.ServersList"));
           startActivity(intent);

            for (int i = 1; i < m_nombreTentative; ++i)
           {
               Log.w("TEST", "je fais la boucle i = " + i);

               try 
               {
                   /* on attend tempsattente secondes avant d'essayer de relancer la connexion. */
                   Thread.currentThread().sleep(tempsattente);

                   /* tentative de connection */
               }

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

            monThread.start();           

       }

} // OnClick()

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

Si, il est possible d'interagir avec un service. D'ailleurs l'exemple souvent donné est celui de lecteur de musique avec les commandes (play, pause, forward,.. ) qui interagissent avec le Service.

La stacktrace ne correspond pas au code que tu as publié. Tu as dû oublier un bout. Mais cela ressemble à une mauvaise gestion de tes threads.

Si tu privilégies un thread je te conseil plutôt d'utiliser AsyncTask qui fait exactement la même chose que ton couple Handler/Thread mais de façon plus abstraite et donc plus facile à implémenter.

Bon courage,

ichpa

Lien vers le commentaire
Partager sur d’autres sites

Tu as essayer avec un startactivityforresult ?

Avec la méthode OnActivityResult tu devrais pouvoir couper taboucle

ci-dessous un exemple de code que j'utilise

/* Handles item selections */
   public boolean onOptionsItemSelected(MenuItem item) {
       switch (item.getItemId()) {
       case 0:
           Intent i = new Intent(this, OptionActivity.class);

           startActivityForResult(i, 1);
           return true;
       }

       return false;
   }

   @Override
   protected void onActivityResult(int requestCode, int resultCode, Intent data) {
   if(requestCode == 1) {
       //SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
       Toast.makeText(this, "Options enregistrées", Toast.LENGTH_SHORT).show();
   }
   super.onActivityResult(requestCode, resultCode, data);
   }

Lien vers le commentaire
Partager sur d’autres sites

Je vais me pencher sur les AsyncTask alors.

Juste pour information et si ça peut aider quelqu'un plus tard mon problème était "juste" que je ne faisais pas un Looper.prepare() avant la boucle dans mon Thread...

En rajoutant cette instruction tout marche très bien! Sauf que je peux lancer autant de Thread que je veux :S

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...