Skip to content

AsyncTask…#65

Open
Spriana wants to merge 3 commits into
FranckRJ:masterfrom
Spriana:asynctask
Open

AsyncTask…#65
Spriana wants to merge 3 commits into
FranckRJ:masterfrom
Spriana:asynctask

Conversation

@Spriana

@Spriana Spriana commented Jun 27, 2026

Copy link
Copy Markdown
Contributor

Réimplémentation maison minimale d’AsyncTask, avec ajout de tests unitaires (qui sont limités dans leurs capacités), dans le premier commit.

Le second et troisième commit ajoutent des tests Robolectric afin de pouvoir simuler avec un Looper (synthétique, réimplémenté du côté de Robolectric).

J’ai aussi testé manuellement en faisant une rotation écran (ce qui détruit et recrée activité et fragment) dans le simulateur tandis qu’un topic chargeait. Enfin, je crois que mon timing a fini par être bon.

Spriana and others added 3 commits June 27, 2026 15:41
android.os.AsyncTask est déprécié depuis Android 11. Introduit AbsAsyncTask (Executor + Handler) qui reproduit son API (execute / executeOnExecutor / cancel / isCancelled / getStatus / publishProgress et les callbacks de cycle de vie), puis y rebranche AbsWebRequestAsyncTask, ImageGetterAsyncTask, ImageDownloader et JVCTopicModeIRCGetter. Le comportement est préservé : execute() passe par un exécuteur série global et le pool parallèle reprend la configuration d’AsyncTask (avec minSdk 23, l’app n’a de toute façon jamais connu que ce comportement série).

cancel() ne prend plus de paramètre mayInterruptIfRunning : l’annulation est coopérative et ce drapeau était de toute façon ignoré, autant retirer l’option plutôt que de la laisser trompeuse.

Ajoute des tests unitaires du cycle de vie (AbsAsyncTaskTest) et un stress test de l’exécuteur série (SerialExecutorTest).

Limites de ces tests, à ne pas surestimer :
- AbsAsyncTaskTest injecte un exécuteur principal synchrone et exécute doInBackground en ligne : il valide l’enchaînement des callbacks, les transitions de statut et le routage de l’annulation, mais court-circuite le vrai Handler/Looper et ne teste donc ni le dispatch réel sur le thread principal ni le passage inter-threads (ce dispatch réel est couvert dans le commit suivant, via Robolectric).
- SerialExecutorTest est probabiliste : il prouve l’exclusion mutuelle pour les entrelacements observés, pas l’absence de course dans l’absolu.
- Aucun test n’exerce les vrais doInBackground des tâches concrètes (requêtes réseau via WebManager + parsing HTML) : pas de point d’injection pour simuler le réseau, donc ces corps ne sont couverts que par l’app réelle. Les ~17 sous-classes, ImageGetterAsyncTask et ImageDownloader ne sont pas testés unitairement.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Les tests JVM purs court-circuitent le Handler en injectant un exécuteur synchrone. Ce test passe par Robolectric pour disposer d’un vrai Looper principal et vérifier le dispatch réel : le résultat est posté sur le Looper principal puis exécuté quand celui-ci tourne (onPostExecute sur le thread principal), une annulation route vers onCancelled, et un clearListenersAndCancel avant le dispatch (cas de la rotation pendant un chargement) abandonne le résultat.

Limites de ce test, à ne pas surestimer :
- doInBackground tourne en ligne (exécuteur direct) : on valide le dispatch via le vrai Looper, mais pas le vrai passage inter-threads ni le timing réel d’un thread de fond.
- Test ciblé, pas full-stack : pas d’inflation d’activité ni de réseau réel. Les vrais doInBackground des tâches concrètes (réseau + parsing) restent couverts uniquement par l’app (rotation pendant un chargement vérifiée manuellement).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Couvre le chemin image (parallèle), qui ne diffère du chemin topic que sur la progression (publishProgress / onProgressUpdate, inutilisée par les tâches web). Via le vrai Looper : progression et fin sont transmises au RequestStatusChanged sur le thread principal, et un teardown façon ImageDownloader.stopAllCurrentTasks() (listener coupé + cancel) avant que le Looper ne tourne abandonne la livraison.

Limite : doInBackground est stubbé (pas de réseau ni de fichier), on teste le câblage des callbacks, pas le téléchargement réel, qui reste couvert uniquement par l’app.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant