Gérer les erreurs avec Glance

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

Utiliser un bloc try-catch autour des composants non modulables

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 vos 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)
       }
   }

Disposition par défaut des erreurs

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

<ph type="x-smartling-placeholder">
</ph> Un message d&#39;erreur indiquant le type d&#39;erreur et une suggestion sur son emplacement
  pour le rechercher
Figure 1.Présentation des erreurs par défaut dans Glance 1.0
. Une zone avec le texte &quot;Impossible d&#39;afficher le contenu&quot;
Figure 2.Présentation des erreurs par défaut dans Glance 1.1.0

Glance permet aux développeurs de fournir une mise en page XML comme solution de remplacement si la composition est défaillant. Cela signifie qu'une erreur s'est produite dans le code Compose. UI d'erreur apparaît également en cas d'erreur non détectée dans le code de votre application.

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

Cette mise en page est une mise en page statique avec laquelle votre utilisateur ne peut pas interagir, mais qui est bonne en cas d'urgence.

<ph type="x-smartling-placeholder">
</ph> Contient un en-tête et un champ de texte permettant d&#39;afficher un message d&#39;erreur
Figure 3 : Exemple de mise en page d'erreur personnalisée

Ajouter des actions à l'interface utilisateur d'erreur par défaut

Depuis Glance 1.1.0, Glance vous permet d'ignorer le code de gestion des erreurs par défaut. De cette façon, vous pouvez ajouter des rappels d'action en cas d'exception non détectée ou dans la composition.

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

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

Dans cette fonction, Glance revient à l'API RemoteViews pour la gestion des erreurs. Cela vous permet de spécifier des mises en page et des gestionnaires d'actions au format 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. Remplacer 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éez un intent en attente qui 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.");
}