Les fonctionnalités d'API permettant d'améliorer la gestion des erreurs dans Glance sont incluses à partir d'Android 15. Cette page fournit quelques bonnes pratiques concernant ces API.
Utiliser un bloc try-catch autour de 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. Cela vous permet d'utiliser Compose pour la 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)
}
}
Disposition par défaut des erreurs
En cas d'exception non détectée ou d'erreur Compose, Glance affiche une mise en page de l'erreur par défaut:
![Un message d'erreur indiquant le type d'erreur et une suggestion pour la rechercher](https://developer.android.com/static/partners/glance/images/default_error_layout.png?authuser=5&hl=fr)
![Une zone avec le texte "Impossible d'afficher le contenu"](https://developer.android.com/static/partners/glance/images/new_error_layout.png?authuser=5&hl=fr)
Glance permet aux développeurs de fournir une mise en page XML en cas d'échec de la composition. Cela signifie qu'une erreur s'est produite dans le code Compose. Cette interface utilisateur d'erreur s'affiche également si une erreur non interceptée figure 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 dans les cas d'urgence.
![Contient un en-tête et un champ de texte permettant d'afficher un message d'erreur](https://developer.android.com/static/partners/glance/images/custom_error_layout.png?authuser=5&hl=fr)
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 d'erreur 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 incluant un bouton permettant d'envoyer des commentaires:
- É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>
- 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)
}
- 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)
}
- Gérer l'intent dans votre
GlanceAppWidgetReceiver
override fun onReceive(context: Context, intent: Intent) {
super.onReceive(context, intent)
Log.e("ErrorOnClick", "Button was clicked.");
}