AsyncTask…#65
Open
Spriana wants to merge 3 commits into
Open
Conversation
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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.