Gestire gli errori con Glance

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

Utilizza un blocco try-catch per i componenti non componibili

Compose non consente blocchi try-catch attorno ai composabili, ma ti consente di racchiudere l'altra logica della tua app in questi blocchi. In questo modo puoi utilizzare Scrivi per la visualizzazione dell'errore, 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 di errore predefinito

Se si verifica un'eccezione non rilevata o un errore di composizione, Glance mostra un layout di errore predefinito:

Un messaggio di errore che mostra il tipo di errore e un suggerimento su dove trovarlo
Figura 1.Layout di errore predefinito di Riepilogo 1.0
Una finestra con il testo "Impossibile mostrare i contenuti"
Figura 2.Layout di errore predefinito di Riepilogo 1.1.0

Glance consente agli sviluppatori di fornire un layout XML come opzione di riserva se la composizione non va a buon fine. Ciò significa che si è verificato un errore nel codice di composizione. Questa UI di errore viene visualizzata anche se si verifica un errore non rilevato nel codice dell'app.

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

Si tratta di un layout statico con cui l'utente non può interagire, ma è utile in caso di emergenza.

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

Aggiungere azioni all'interfaccia utente predefinita degli errori

A partire dalla versione 1.1.0, Glance ti consente di sostituire il codice di gestione degli errori predefinito. In questo modo, puoi aggiungere i callback delle azioni in caso di un'eccezione o di un errore nella composizione non rilevati.

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

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

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

Gli esempi riportati di seguito mostrano, passo passo, come creare un'interfaccia utente di errore che include un pulsante per inviare un 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. Sostituisci la 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'intenzione in attesa che faccia riferimento al tuo 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. Gestire l'intenzione in GlanceAppWidgetReceiver
override fun onReceive(context: Context, intent: Intent) {
   super.onReceive(context, intent)
   Log.e("ErrorOnClick", "Button was clicked.");
}