Premiers pas avec android-asynctask

AsyncTask du concept à la mise en œuvre

Concept

AsyncTask est une classe qui permet d’exécuter des opérations en arrière-plan, les résultats étant publiés sur le thread d’interface utilisateur. L’objectif principal est d’éliminer tout le code passe-partout pour démarrer/exécuter un thread en éliminant les gestionnaires et tout ce qui est nécessaire pour manipuler les threads. De plus, le but d’AsyncTask est d’avoir des opérations de courte durée sur un thread d’arrière-plan (quelques secondes au maximum), et non des opérations de longue durée. Par conséquent, il est important qu’AsyncTask ne soit pas confondu avec un framework de threading générique. Si l’on a besoin d’effectuer des opérations de longue durée, le package simultané est recommandé.

Considérations générales

AsyncTask est défini par trois types génériques : Params, Progress et Results. A partir du moment où il est exécuté, il passe par 4 étapes (méthodes). Le premier est onPreExecute, où quelqu’un peut définir une boîte de dialogue de chargement, ou un message d’interface utilisateur qui peut informer l’utilisateur que l’exécution est sur le point de commencer. Ensuite, doInBackground qui est la méthode exécutée de manière asynchrone sur un thread différent du thread Ui. La troisième méthode est onProgressUpdate qui peut également s’exécuter sur le thread d’interface utilisateur qui peut informer l’utilisateur de l’état. La dernière méthode appelée onPostExecute est principalement utilisée pour publier les résultats.

Vous trouverez ci-dessous un exemple d’utilisation d’une AsyncTask renvoyant une chaîne.
Exemple 1

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button = (FloatingActionButton) findViewById(R.id.btn);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                executeAsyncTaskOperation();
            }
        });
    }


      private void executeAsyncTaskOperation() {
        new CustomAsyncTask(this).execute();
    }

    private static class CustomAsyncTask extends AsyncTask<Void, Void, String> {

        private Context context;
        private ProgressDialog progressDialog;

        public CustomAsyncTask(Context context) {
            this.context = context;
        }

        @Override
        protected void onPreExecute() {
            progressDialog = ProgressDialog.show(context, "Please wait...", "Loading data from web");
        }

        @Override
        protected String doInBackground(Void... params) {
            String object = null;
            try {
                Log.d(CustomAsyncTask.class.getCanonicalName(), "doInBackground");
                Thread.sleep(500);
                //bject = "new object";
            } catch (Exception exc) {
                Log.e(CustomAsyncTask.class.getCanonicalName(), "exception");
                object = null;
            }
            return object;
        }

        @Override
        protected void onPostExecute(String s) {
            if (progressDialog != null && progressDialog.isShowing()) {
                progressDialog.dismiss();
            }
            if (s != null) {
                Toast.makeText(context, "finished successfully!", Toast.LENGTH_LONG).show();
            } else {
                Toast.makeText(context, "finished unsuccessfully!", Toast.LENGTH_LONG).show();

            }
        }
    }
}

Exemple 2

Ici, l’AsyncTask est un peu différente, la méthode execute reçoit une liste de données à analyser en arrière-plan. Le résultat de retour dépend de cette vérification.

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();

                executeAsyncTaskOperation();
            }
        });
    }


    private void executeAsyncTaskOperation() {
        Boolean[] bools = new Boolean[10];
        for (int k = 0; k < 10; k++) {
            if (k % 2 == 0) {
                bools[k] = true;
            } else {
                bools[k] = false;
            }
        }
        new CustomAsyncTask(this).execute(bools);
    }

    private static class CustomAsyncTask extends AsyncTask<Boolean, Void, Integer> {

        private Context context;
        private ProgressDialog progressDialog;

        public CustomAsyncTask(Context context) {
            this.context = context;
        }

        @Override
        protected void onPreExecute() {
            progressDialog = ProgressDialog.show(context, "Please wait...", "Loading data from web");
        }

        @Override
        protected Integer doInBackground(Boolean... params) {
            int count = 0;
            try {
                Thread.sleep(1000);
                Log.d(CustomAsyncTask.class.getCanonicalName(), "doInBackground");
                for (Boolean param : params) {
                    if (param) {
                        count++;
                    }
                }
            } catch (Exception exc) {
                Log.e(CustomAsyncTask.class.getCanonicalName(), "exception");
                count = 0;
            }
            return count;
        }

        @Override
        protected void onPostExecute(Integer s) {
            if (progressDialog != null && progressDialog.isShowing()) {
                progressDialog.dismiss();
            }
            if (s != null && s > 0) {
                Toast.makeText(context, "finished loading: " + s + " tasks", Toast.LENGTH_LONG).show();
            } else {
                Toast.makeText(context, "finished unsuccessfully!", Toast.LENGTH_LONG).show();

            }
        }
    }
}