Aller au contenu

Break

Résumé

  • Nom interne : Break
  • Catégorie : Control Flow
  • Objectif : Arrêter immédiatement le connecteur de boucle englobant (Iterate, ForEachElement, ou ForEachElementInScreen) - le workflow externe continue ensuite normalement juste après la boucle.
  • Type de tâche : Normal

Compatibilité

  • Version minimale AndroMate : 1.1.0

  • Version maximale AndroMate : 1.1.0

  • Android minimum : Android 13 (API 33)

  • Android maximum testé : Android 16 (API 36)

  • Constructeurs supportés :

    • Samsung (One UI 6.x / 7.x / 8.x)
    • Autres constructeurs - pas encore supportés (Xiaomi HyperOS et Google Pixel en cours d'adaptation)
  • Permissions requises :

    • Aucune

Description détaillée

La tâche Break est l'équivalent AndroMate du mot-clé break de Java. Placée dans le sous-workflow "do" d'un connecteur de boucle (Iterate, ForEachElement, ou ForEachElementInScreen), elle arrête cette boucle immédiatement : le passage en cours s'arrête à cet endroit précis (toute tâche placée après Break dans le même "do" est ignorée), aucune itération supplémentaire ne s'exécute, et l'exécution reprend à la tâche qui suit le connecteur de boucle dans le graphe externe - exactement comme si la plage/liste/liste d'éléments avait été entièrement parcourue.

Break n'a de sens que dans le sous-workflow "do" d'un connecteur de boucle. Elle n'a aucune signification particulière ailleurs dans un workflow - voir Exceptions ci-dessous.

Break ne prend jamais d'entrée et ne produit jamais de variable - c'est un pur signal de contrôle de flux, généralement placé derrière la branche true d'une tâche condition (CompareStrings, CompareNumber, IsElementExist) pour que la boucle ne s'arrête qu'une fois une cible trouvée.


Paramètres d'entrée

Cette tâche n'a aucun paramètre d'entrée.


Paramètres de sortie

Cette tâche ne produit aucune variable de sortie. Elle retourne un VoidResult en cas de succès.


Exceptions

Code Nom de l'exception Description
ITERATE-PIPELINE-007 Loop Break Requested Signal interne qui arrête la boucle englobante. Jamais visible quand Break est utilisée correctement dans le "do" d'un connecteur de boucle - ne remonte comme erreur non gérée que si Break est placée en dehors de tout sous-workflow de connecteur de boucle (il n'y a alors aucune boucle pour l'intercepter).

Diagramme d'exécution

flowchart TD
    B([Break]) --> SetFlag[Demande de break sur ce sous-workflow do]
    SetFlag --> Return([VoidResult])
    Return -.->|prochaine vérification, même do| Check{Break demandé ?}
    Check -->|Oui| Throw[ITERATE-PIPELINE-007\nLOOP_BREAK_REQUESTED]
    Throw --> Catch[Intercepté par le connecteur\nde boucle englobant]
    Catch --> StopLoop[Arrêt de la boucle\naucune itération de plus]
    StopLoop --> Continue[Suivre le lien externe 'to'\ndu connecteur de boucle]
    Continue --> Success([Le workflow externe continue])

    style B fill:#e3f2fd
    style Success fill:#c8e6c9
    style Throw fill:#ffcdd2
    style SetFlag fill:#fff9c4
    style StopLoop fill:#fff9c4

Comment ça fonctionne :

  1. Poser le flag : Break demande un break sur le TaskGraphControl attaché au sous-workflow "do" dans lequel elle s'exécute, puis retourne immédiatement VoidResult - rien n'est levé à ce stade.
  2. Détecté à la prochaine vérification : juste avant d'exécuter le nœud suivant dans ce même parcours "do", le moteur remarque le flag et lève LOOP_BREAK_REQUESTED - toute tâche placée après Break dans ce passage ne s'exécute jamais.
  3. Intercepté par la boucle : le connecteur de boucle englobant (Iterate, ForEachElement, ou ForEachElementInScreen) intercepte ce signal précis, nettoie le flag, et arrête de boucler - comme si la plage/liste/liste d'éléments avait été entièrement parcourue.
  4. Le workflow externe continue : l'exécution reprend normalement à la tâche qui suit le connecteur de boucle dans le graphe externe.

Exemples de code

Exemple 1 - Arrêter une recherche ForEachElementInScreen une fois la cible trouvée

"do": {
  "StartSubTask": [{ "id": "20001" }],
  "CompareStrings": [
    { "id": "20002", "var_x": "$elementText", "var_y": "Submit", "compare_type": "Equal" }
  ],
  "Break": [{ "id": "20003" }],
  "End": [{ "id": "20004" }],
  "Links": [
    { "from": "20001", "to": "20002" },
    { "from": "20002", "true": "20003", "false": "20004" },
    { "from": "20003", "to": "20004" }
  ]
}

Détails des paramètres d'entrée

Cette tâche n'a aucun paramètre d'entrée.


Détails des paramètres de sortie

Cette tâche n'a aucun paramètre de sortie.


Exemple JSON complet

Boucle de 1 à 10 en affichant chaque nombre, mais sort de la boucle (sans afficher) dès que $i atteint 5 - donc elle affiche seulement 1 à 4 :

{
  "Start": [
    { "id": "1000", "variables": [{ "variableName": "$i", "variableValue": "0", "is_kpi": false }] }
  ],
  "Iterate": [
    {
      "id": "1001",
      "title": "Afficher jusqu'à 5",
      "iteration_variable_input": "$i",
      "start_index": 1,
      "end_index": 10,
      "do": {
        "StartSubTask": [{ "id": "10001" }],
        "CompareNumber": [
          { "id": "10002", "num_x": "$i", "num_y": "5", "compare_type": 1 }
        ],
        "TextReport": [
          { "id": "10003", "texte": "Numéro d'itération : $i", "texte_type": 0 }
        ],
        "Break": [{ "id": "10004" }],
        "End": [{ "id": "10005" }],
        "Links": [
          { "from": "10001", "to": "10002" },
          { "from": "10002", "true": "10004", "false": "10003" },
          { "from": "10003", "to": "10005" },
          { "from": "10004", "to": "10005" }
        ]
      }
    }
  ],
  "End": [{ "id": "1002" }],
  "Links": [
    { "from": "1000", "to": "1001" },
    { "from": "1001", "to": "1002" }
  ]
}