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
Libérer: 2024-12-13 21:21:12
original
852 Les gens l'ont consulté

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);
}
Copier après la connexion

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);
    }
}
Copier après la connexion

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
    }
});
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal