Modification des données de classe interne dans AsyncTask
Dans ce scénario, vous disposez d'une classe interne, Decompress, qui étend AsyncTask et tente de modifier le membre variables de sa classe englobante, Unzip. Cependant, ces modifications semblent être perdues lors de l'accès depuis la classe externe.
Mise à jour des données
Le problème vient du fait qu'AsyncTask fonctionne de manière asynchrone, ce qui signifie qu'il s'exécute dans un fil séparé. Même si les modifications apportées aux variables membres persisteront dans la classe, elles risquent de ne pas être reflétées immédiatement dans la classe englobante en raison de la séparation des threads. Pour garantir que la classe externe peut accéder aux valeurs mises à jour, un mécanisme de rappel peut être implémenté.
Interface de rappel
Une solution consiste à créer une interface avec une méthode qui être rappelé lorsque la classe interne a terminé sa tâche et mis à jour les valeurs. Dans votre exemple, vous pouvez définir une interface comme la suivante :
public interface InnerClassUpdateListener { void onInnerClassUpdate(String index, String unzipDest); }
Implementation
Dans la classe Decompress, implémentez la méthode onInnerClassUpdate dans AsyncTask. Cette méthode serait appelée lorsque la classe interne aurait terminé sa tâche et que les valeurs auraient été mises à jour. Dans votre méthode doInBackground, ajoutez le code :
if (unzip operation is successful) { result = true; index = url pointing to location of unzipped folder; unzipDest = something; //unzip destination is set here if (callback != null) { callback.onInnerClassUpdate(index, unzipDest); } }
Dans la classe Unzip, inscrivez-vous en tant qu'auditeur du rappel. Par exemple :
Decompress decompress = new Decompress(location, activity); decompress.setCallback(new InnerClassUpdateListener(){ @Override public void onInnerClassUpdate(String index, String unzipDest) { // Update your outer class variables here } });
Considérations sur les threads
Comme vous l'avez correctement noté, AsyncTask s'exécute dans un thread séparé. Cela signifie que toutes les valeurs mises à jour dans ce thread resteront dans ce thread jusqu'à ce que la tâche soit terminée. Cependant, une fois la tâche terminée et la méthode onPostExecute appelée, les valeurs mises à jour seront disponibles pour la classe englobante. En implémentant un rappel, vous pouvez vous assurer que la classe externe peut accéder aux valeurs mises à jour lorsqu'elles deviennent disponibles.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!