Question

J'ai une opération de nettoyage « de longue durée » que je dois effectuer dans onDestroy() de mon Activity.Quelle est la meilleure façon de procéder?

Si j'utilise un Thread pour faire ça, mon onDestroy() reviendra immédiatement;mais qu'arrive-t-il à la référence Thread ?Je recherche des conseils sur les implications/pièges/déclenchements dont je dois être conscient ici car je suppose que le processus sera toujours en vie même après la destruction de l'activité.


Arrière-plan:

j'utilise JmDNS dans mon application.Lorsque l'utilisateur a terminé avec mon application, je souhaite nettoyer l'instance JmDNS.Je fais cela en utilisant le close() méthode de JmDNS classe.Cependant, cette méthode prend plus de 5 secondes compléter.En conséquence, l'utilisateur voit mon Activity reste longtemps à l'écran après avoir appuyé sur la touche Retour.

Je n'ai pas encore compris pourquoi le close() cela prend autant de temps, mais entre-temps, j'ai également réalisé que je n'avais vraiment pas besoin d'attendre que la clôture se termine avec succès.Tout ce dont j'ai besoin, c'est d'un moyen de "déclencher" la clôture et d'en finir.

Était-ce utile?

La solution

J'ai fini par faire ce que j'avais demandé dans la question : je lance un Thread pour effectuer l'opération de longue durée dans onDestroy().

Un cas que j'ai dû considérer était celui où l'utilisateur rouvre mon application avant même la fin de la longue exécution.Dans mon application, cela signifie qu'une nouvelle instance de JmDNS est créée.Donc, je nettoie chaque instance séparément dans mon onDestroy.

Votre cas d'utilisation peut différer : vous souhaiterez peut-être lancer le thread de nettoyage uniquement s'il n'est pas déjà en cours d'exécution (en utilisant Threadc'est isAlive() méthode ou une telle technique).

Voici un exemple de code.Pour apprécier la partie « nettoyer chaque instance séparément », effectuez la séquence d'étapes suivante :

  1. Lancez l'application
  2. Appuyer sur le bouton précédent.Vous verrez l'opération de nettoyage dans LogCat
  3. Relancez l'application.
  4. Encore une fois, quittez l'application.Vous verrez désormais deux ensembles de journaux de nettoyage : le premier représente le nettoyage de la première instance ;et le deuxième ensemble correspondant à la deuxième instance.

    public class DelayedExitActivity extends Activity {
    
        private static final String LOG_TAG = "DelayedExit";
        private final  Runnable longOperation = new Runnable(){
            @Override
            public void run() {
                for (int i=0 ; i < 50; i++){
                    Log.d(LOG_TAG, "Iteration "+i);
                    try {
                        Thread.sleep(2 * 1000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        };
        private Thread longThread ;
    
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
        }
    
        @Override
        protected void onDestroy() {
            if(longThread == null){
                longThread = new Thread(longOperation);
            }
            longThread.start();
            super.onDestroy();
        }
    }
    

Autres conseils

Essayez de démarrer votre fil de discussion dans onBackPressed() et appelle destroy() quand votre fil sera terminé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top