Maison >Java >javaDidacticiel >Pourquoi les modifications de données de ma classe interne AsyncTask ne sont-elles pas reflétées dans la classe externe ?

Pourquoi les modifications de données de ma classe interne AsyncTask ne sont-elles pas reflétées dans la classe externe ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-13 21:21:12914parcourir

Why Are My Inner Class AsyncTask's Data Changes Not Reflected in the Outer Class?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn