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 intorno agli elementi componibili, ma consente di dall'altra logica dell'app in questi blocchi. In questo modo puoi utilizzare Compose per visualizzazione degli errori, come illustrato 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 si verifica un'eccezione non rilevata o un errore di scrittura, Riepilogo mostra layout degli errori predefinito:

Un messaggio di errore che mostra il tipo di errore e un suggerimento per la posizione
  per 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 Riepilogo consente agli sviluppatori di fornire un layout XML come riserva se per la composizione non riesce. Ciò significa che si è verificato un errore nel codice Compose. UI di questo errore viene visualizzata anche se nel codice dell'app è presente un errore non rilevato.

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

Questo layout è statico con cui l'utente non può interagire, ma è accettabile nei 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 azioni nel caso di un'eccezione non rilevata o 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 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. 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.");
}