Maison >Java >javaDidacticiel >Comment renvoyer correctement une valeur booléenne à partir d'une AsyncTask Android ?
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!