Gérer les erreurs avec Glance

Les fonctionnalités d'API permettant d'améliorer la gestion des erreurs sur Glance sont incluses à partir d'Android 15. Cette page présente quelques bonnes pratiques concernant ces API.

Utiliser un bloc try-catch autour des composants non composables

Compose n'autorise pas les blocs try-catch autour des composables, mais vous permet d'encapsuler l'autre logique de votre application dans ces blocs. Vous pouvez ainsi utiliser Compose pour votre vue d'erreur, comme illustré dans l'exemple suivant:

provideContent {
       var isError = false;
       var data = null
       try {
           val repository = (context.applicationContext as MyApplication).myRepository
           data = repository.loadData()
       } catch (e: Exception) {
           isError = true;
           //handleError
       }

       if (isError) {
           ErrorView()
       } else {
           Content(data)
       }
   }

Mise en page d'erreur par défaut

En cas d'exception non interceptée ou d'erreur Compose, Glance affiche une mise en page d'erreur par défaut:

Message d'erreur indiquant le type d'erreur et une suggestion d'emplacement où la rechercher
Figure 1 : Mise en page par défaut des erreurs dans Glance 1.0
Boîte contenant le texte "Impossible d'afficher le contenu"
Figure 2 : Mise en page par défaut des erreurs dans Glance 1.1.0

Glance permet aux développeurs de fournir une mise en page XML en remplacement si la composition échoue. Cela signifie qu'une erreur s'est produite dans le code Compose. Cette UI d'erreur s'affiche également si une erreur non détectée se produit dans le code de votre application.

class UpgradeWidget : GlanceAppWidget(errorUiLayout = R.layout.error_layout)

Il s'agit d'une mise en page statique avec laquelle l'utilisateur ne peut pas interagir, mais qui est utile en cas d'urgence.

Contient un titre et un champ de texte pour afficher un message d'erreur
Figure 3 : Exemple de mise en page d'erreur personnalisée

Ajouter des actions à l'UI d'erreur par défaut

À partir de Glance 1.1.0, Glance vous permet de remplacer le code de gestion des erreurs par défaut. Vous pouvez ainsi ajouter des rappels d'action en cas d'exception ou d'erreur non détectée lors de la composition.

Pour utiliser cette fonctionnalité, remplacez la fonction onCompositionError():

GlanceAppWidget.onCompositionError(
    context: Context,
    glanceId: GlanceId,
    AppWidgetId: Int,
    throwable: Throwable
)

Dans cette fonction, Glance utilise l'API RemoteViews pour la gestion des erreurs. Vous pouvez ainsi spécifier des mises en page et des gestionnaires d'actions à l'aide de XML.

Les exemples suivants vous montrent, étape par étape, comment créer une UI d'erreur qui inclut un bouton permettant d'envoyer des commentaires:

  1. Écrire le fichier error_layout.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   style="@style/Widget.MyApplication.AppWidget.Error"
   android:id="@android:id/background"
   android:layout_width="match_parent"
   android:textSize="24sp"
   android:layout_height="match_parent"
   android:orientation="vertical">


   <TextView
       android:id="@+id/error_title_view"
       android:layout_width="match_parent"
       android:textColor="@color/white"
       android:textFontWeight="800"
       android:layout_height="wrap_content"
       android:text="Example Widget Error" />

   <LinearLayout
       android:layout_width="match_parent"
       android:orientation="horizontal"
       android:paddingTop="4dp"
       android:layout_height="match_parent">

       <ImageButton
           android:layout_width="64dp"
           android:layout_height="64dp"
           android:layout_gravity="center"
           android:tint="@color/white"
           android:id="@+id/error_icon"
           android:src="@drawable/heart_broken_fill0_wght400_grad0_opsz24"
       />
       <TextView
           android:id="@+id/error_text_view"
           android:layout_width="wrap_content"
           android:textColor="@color/white"
           android:layout_height="wrap_content"
           android:layout_gravity="center"
           android:padding="8dp"
           android:textSize="16sp"
           android:layout_weight="1"
           android:text="Useful Error Message!" />
   </LinearLayout>

</LinearLayout>

  1. Ignorer la fonction onCompositionError
override fun onCompositionError(
   context: Context,
   glanceId: GlanceId,
   AppWidgetId: Int,
   throwable: Throwable
) {
   val rv = RemoteViews(context.packageName, R.layout.error_layout)
   rv.setTextViewText(
       R.id.error_text_view,
       "Error was thrown. \nThis is a custom view \nError Message: `${throwable.message}`"
   )
   rv.setOnClickPendingIntent(R.id.error_icon, getErrorIntent(context, throwable))
   AppWidgetManager.getInstance(context).updateAppWidget(AppWidgetId, rv)
}

  1. Créer un intent en attente qui fait référence à votre GlanceAppWidgetReceiver
private fun getErrorIntent(context: Context, throwable: Throwable): PendingIntent {
    val intent = Intent(context, UpgradeToHelloWorldPro::class.java)
    intent.setAction("widgetError")
    return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_IMMUTABLE)
}

  1. Gérer l'intent dans votre GlanceAppWidgetReceiver
override fun onReceive(context: Context, intent: Intent) {
   super.onReceive(context, intent)
   Log.e("ErrorOnClick", "Button was clicked.");
}