Gestire gli errori con Glance

Le funzionalità API per migliorare la gestione degli errori su Glance sono incluse a partire da Android 15. Questa pagina fornisce alcune best practice relative a queste API.

Utilizzare un blocco di prova intorno ai componenti non componibili

Compose non consente blocchi di prova per gli elementi componibili, ma consente di racchiudere l'altra logica dell'app in questi blocchi. In questo modo puoi utilizzare Compose per la visualizzazione degli errori, come mostrato nell'esempio seguente:

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

Layout degli errori predefinito

Se c'è un'eccezione non rilevata o un errore di scrittura, Glance mostra un layout di errore predefinito:

Un messaggio che mostra il tipo di errore e un suggerimento su dove cercarlo
Figura 1.Layout degli errori predefinito di Looker 1.0
Una casella con il testo "Impossibile mostrare i contenuti"
Figura 2.Layout degli errori predefinito di Looker 1.1.0

Il Glance consente agli sviluppatori di fornire un layout XML come riserva in caso di errore della composizione. Ciò significa che si è verificato un errore nel codice Compose. Questa UI di errore viene visualizzata anche se hai un errore non rilevato nel codice dell'app.

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

Questo layout è statico con cui l'utente non può interagire, ma è adatto in casi di emergenza.

Contiene un'intestazione e un campo di testo per visualizzare un messaggio di errore
Figura 3.Esempio di layout di errore personalizzato

Aggiungi azioni all'interfaccia utente degli errori predefinita

A partire da Glance 1.1.0, Glance consente di ignorare il codice predefinito per la gestione degli errori. In questo modo, puoi aggiungere callback di azione nel caso di un'eccezione non rilevata o un errore di composizione.

Per utilizzare questa funzionalità, sostituisci la funzione onCompositionError():

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

In questa funzione, Glance utilizza l'API RemoteViews per la gestione degli errori. In questo modo puoi specificare layout e gestori di azioni utilizzando XML.

I seguenti esempi mostrano, passo passo, come creare un'interfaccia utente di errore che include un pulsante per inviare feedback:

  1. Scrivi il file 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. Esegui l'override della funzione 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. Crea un intent in attesa che faccia riferimento a 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. Gestisci l'intent in GlanceAppWidgetReceiver
override fun onReceive(context: Context, intent: Intent) {
   super.onReceive(context, intent)
   Log.e("ErrorOnClick", "Button was clicked.");
}