Optimiser la récupération des flows et paywalls dans le SDK Android
Une récupération fiable d’un flow ou d’un paywall sur Android repose sur trois points : un affichage rapide, le retour de la variante ciblée par audience, et un repli élégant en cas de réseau lent. Les règles ci-dessous couvrent le timing, la mise en cache et les patterns de secours pour y parvenir.
Ces règles supposent que Adapty.activate() et Adapty.identify() ont déjà été résolus. Voir Ordre des appels dans le SDK Android.
Règles et pièges
| Faites ceci | Ne faites pas cela | Pourquoi |
|---|---|---|
Récupérez le placement que vous êtes sur le point d’afficher, ou préchauffez le cache avec preloadFlows (SDK 4.1+). | Déclenchez vos propres appels getFlow concurrents au démarrage. | Un prefetch manuel bloque le thread principal et produit un écran noir. preloadFlows est conçu pour ça et exécute le lot en parallèle pour vous. |
Appelez getFlow après que l’attribution a eu le temps de se résoudre — par exemple, 1 à 2 secondes après activate ou après le déclenchement de setOnProfileUpdatedListener. | Appelez getFlow dans Application.onCreate(). | L’attribution n’est pas encore arrivée. Le flow est résolu selon l’audience par défaut et contourne silencieusement les segments et la personnalisation ASA. |
Définissez un loadTimeout et configurez un paywall de secours pour chaque placement. | Attendez getFlow indéfiniment. | Sans timeout, les utilisateurs en mauvaise connectivité voient un écran vide jusqu’à ce que le réseau réponde — ou ferment l’application. |
Consultez Récupérer les paywalls et les produits pour la référence des paramètres fetchPolicy et loadTimeout, et Placements pour choisir le bon placement.
Précharger les placements
preloadFlows et preloadFlowsForDefaultAudience sont disponibles à partir de la version 4.1 du SDK.
preloadFlows met en cache le JSON du flow à l’avance — une requête par placement. Vous l’utilisez ensuite normalement : getFlow pour le flow, getFlowConfiguration pour sa configuration d’affichage.
fetchPolicy détermine quelle couche un getFlow ultérieur lit en premier, et non s’il peut accéder au cache :
ReturnCacheDataElseLoadlit d’abord la copie préchargée et ne contacte le réseau que si rien n’est en cache.ReturnCacheDataIfNotExpiredElseLoad(maxAgeMillis)fait de même tant que la copie est plus récente quemaxAgeMillis.- La valeur par défaut,
ReloadRevalidatingCacheData, contacte d’abord le réseau et bascule sur la copie préchargée si la requête échoue ou expire.
Un préchargement est utile dans les deux cas, mais différemment : une politique cache-first supprime la requête, tandis que la valeur par défaut la conserve et dispose d’une copie de secours prête à l’emploi.
Utilisez cette méthode quand vous savez quels placements la session va utiliser, mais que vous ne souhaitez pas encore les afficher — par exemple, juste après la résolution de activate et identify, pour le flow derrière un bouton que l’utilisateur n’a pas encore appuyé.
Paramètres :
placementIds(obligatoire) : les placements à précharger. Les identifiants vides et en double sont ignorés.loadTimeout(optionnel) : délai d’expiration appliqué à chaque placement du lot, et non au lot dans son ensemble. Par défaut à 5 secondes ; les valeurs inférieures à 1 seconde sont relevées à 1 seconde.
Points importants à connaître :
- Le callback ne se déclenche qu’après que tous les placements ont été traités, et il reporte les échecs par placement ensemble. L’échec d’un placement n’empêche pas les autres de s’exécuter.
- Si un placement expire, rencontre une erreur serveur ou une erreur réseau, le SDK bascule sur les variantes de secours pour ce placement. Les autres échecs sont remontés tels quels.
- Le préchargement ne fait que réchauffer le cache. Il ne retourne pas de contenu — vous appelez toujours
getFlowpour l’afficher.
Ce que couvre un préchargement
Un flow s’affiche à l’écran en plusieurs couches. Un préchargement couvre la première, exactement comme getFlow :
| Couche | Récupérée par | Préchauffée par un préchargement |
|---|---|---|
| JSON du flow — la variante choisie, ses IDs de produits et la Remote Config | getFlow | Oui |
| Mise en page de l’interface — structure, style et texte de l’écran | getFlowConfiguration | Non |
| Images, y compris l’image fixe utilisée à la place d’un élément vidéo | getFlowConfiguration, en arrière-plan | Non |
| Fichiers vidéo | Le lecteur système, au rendu de l’écran | Non mis en cache par le SDK |
getFlowConfiguration attend le layout, donc la première requête pour un layout donné coûte un aller-retour réseau même après un préchargement. Le SDK conserve ensuite ce layout dans son propre cache disque, qui survit aux redémarrages de l’application et est lu avant tout appel réseau — le coût ne tombe donc que sur la première requête, pas sur toutes les suivantes. Une fois le layout en main, le SDK commence à mettre en cache les images indépendamment de l’appel : cela ne bloque pas l’affichage de l’écran, et aucun callback ni aucune erreur ne signale la fin de cette opération.
Identifier quel placement a échoué
Le callback reçoit une AdaptyPreloadPlacementsError couvrant l’ensemble du lot, avec le code REQUEST_FAILED (2005). Pour voir les échecs individuels, lisez sa propriété preloadErrors — une map indexée par ID de placement :
Adapty.preloadFlows(listOf("onboarding", "main_paywall")) { error ->
if (error is AdaptyPreloadPlacementsError) {
error.preloadErrors.forEach { (placementId, placementError) ->
// log or retry the individual placement
}
}
}
preloadErrors existe uniquement sur AdaptyPreloadPlacementsError, donc vérifiez d’abord le type — tout autre AdaptyError provient d’autre chose qu’une défaillance par placement.
Ignorer la segmentation d’audience
Pour préchauffer le cache sans attendre la segmentation d’audience, utilisez la variante d’audience par défaut. Elle ne prend pas de loadTimeout :
Adapty.preloadFlowsForDefaultAudience(listOf("main_paywall")) { error -> }
Afficher les médias du premier écran depuis le bundle de l’application
Un flow télécharge ses images et vidéos depuis Adapty. Pour afficher les médias du premier écran instantanément, servez-les depuis le bundle de l’application. C’est une bonne façon de réutiliser des médias que vous livrez déjà, comme les visuels d’un onboarding natif existant.
- Dans le Flow & Paywall Builder, définissez un identifiant de média personnalisé sur l’image ou la vidéo. Le fichier que vous téléversez là-bas reste comme fichier de secours.
- Ajoutez le fichier dans le dossier
res/rawouassetsde votre application. - Lorsque vous créez la vue du flow avec
getFlowView, passez le fichier intégré pour cet identifiant danscustomAssets:
// "welcome_video" is the custom media ID set in the Flow & Paywall Builder
val bundledAssets = AdaptyCustomAssets.of(
"welcome_video" to
AdaptyCustomVideoAsset.file(
FileLocation.fromResId(requireContext(), R.raw.welcome),
preview = AdaptyCustomImageAsset.file(
FileLocation.fromResId(requireContext(), R.drawable.welcome_poster),
),
resolution = AdaptyCustomVideoAsset.Resolution(width = 1080, height = 1920),
),
)
val flowView = AdaptyUI.getFlowView(
activity,
flowConfiguration,
products,
eventListener,
insets,
bundledAssets,
)
Les fichiers groupés augmentent la taille de téléchargement de votre app, donc ne groupez que les médias visibles dès le premier affichage.
Les médias non groupés s’affichent tout de même immédiatement : la configuration de la vue embarque une petite copie basse résolution de chaque image, ainsi que l’image fixe des vidéos, et l’affiche jusqu’au chargement du fichier complet.
Pour la référence complète de customAssets, voir Personnaliser les assets.
Optimiser pour les connexions instables
Pour les marchés où la connectivité est durablement mauvaise (zones rurales, transports, régions affectées par le routage) :
- Définissez
fetchPolicysurAdaptyPlacementFetchPolicy.ReturnCacheDataElseLoadpour chaque récupération sauf la toute première. - Configurez un paywall de secours pour chaque placement dans l’Adapty Dashboard.
- Réglez
loadTimeoutsur 3 à 5 secondes et acceptez le paywall de secours lorsque le délai expire. - Ne conditionnez pas l’affichage du flow à
getProfile. AppelezgetFlowindépendamment pour qu’un profil lent ne bloque pas l’interface.