Effectuer une opération de longue durée dans onDestroy
-
13-11-2019 - |
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.
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 Thread
c'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 :
- Lancez l'application
- Appuyer sur le bouton précédent.Vous verrez l'opération de nettoyage dans LogCat
- Relancez l'application.
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é.