Maison >Java >javaDidacticiel >Comment renvoyer correctement une valeur booléenne à partir d'une AsyncTask Android ?

Comment renvoyer correctement une valeur booléenne à partir d'une AsyncTask Android ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-11 10:38:10645parcourir

How to Properly Return a Boolean Value from an Android AsyncTask?

Comment renvoyer une valeur booléenne à partir d'AsyncTask

Dans la programmation Android, AsyncTask est une classe conçue pour effectuer des opérations en arrière-plan dans un thread séparé. Dans ce contexte, le défi se pose lorsque vous devez renvoyer une valeur booléenne à partir d'une tâche asynchrone, car elle fonctionne de manière asynchrone.

Considérez le scénario dans lequel vous disposez d'une interface utilisateur avec EditTexts pour l'adresse FTP, le nom d'utilisateur, le mot de passe, et port. Lorsque l'utilisateur clique sur le bouton « testConnection », une tentative de connexion est tentée et une valeur booléenne est renvoyée en fonction de l'état de la connexion.

Défi lié au retour d'une valeur booléenne à partir d'une tâche asynchrone

Au départ, le code peut ressembler à l'exemple fourni :

boolean status = ftpConnect(_address, _username, _password,_port);
ftpDisconnect();

if (status == true) {
 Toast.makeText(SiteManager.this, "Connection Succesful",
 Toast.LENGTH_LONG).show();
 } else {
 Toast.makeText(SiteManager.this,
 "Connection Failed:" + status, Toast.LENGTH_LONG).show();

 } 

Cependant, lors de l'utilisation d'AsyncTask, le code dans doInBackground s'exécutera en arrière-plan et la méthode onPostExecute sera appelée quel que soit le résultat de l'opération en arrière-plan. Cela signifie que le statut booléen ne sera pas disponible dans la méthode onPostExecute.

Solution : Implémenter une interface de rappel

Pour surmonter ce défi, nous pouvons implémenter une interface de rappel . Voici comment procéder :

public interface MyInterface {
    public void myMethod(boolean result);
}

public class AsyncConnectTask extends AsyncTask<Void, Void, Boolean> {

    private MyInterface mListener;


    public AsyncConnectTask(Context context, String address, String user,
        String pass, int port, MyInterface mListener) {
        mContext = context;
        _address = address;
        _user = user;
        _pass = pass;
        _port = port;
        this.mListener  = mListener;
    }

    @Override
    protected Boolean doInBackground(Void... params) {
        ....
        return result;
   }


    @Override
    protected void onPostExecute(Boolean result) {
        if (mListener != null) 
            mListener.myMethod(result);
    }
}

Maintenant, dans votre activité ou fragment :

AsyncConnectTask task = new AsyncConnectTask(SiteManager.this,
                        _address, _username, _password, _port,  new MyInterface() {
    @Override
    public void myMethod(boolean result) {
        if (result == true) {
            Toast.makeText(SiteManager.this, "Connection Succesful",
            Toast.LENGTH_LONG).show();
        } else {
            Toast.makeText(SiteManager.this, "Connection Failed:" + status, Toast.LENGTH_LONG).show();
        } 
    }
});

task.execute();

Cette approche garantit que le résultat de doInBackground est renvoyé au thread de l'interface utilisateur via l'interface de rappel. Vous pouvez appeler myMethod depuis onPostExecute pour exécuter le code sur le thread de l'interface utilisateur, sinon vous devrez publier un Runnable via un gestionnaire.

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