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:
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.
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:
- 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>
- 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)
}
- 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)
}
- Gestire l'intenzione in
GlanceAppWidgetReceiver
override fun onReceive(context: Context, intent: Intent) {
super.onReceive(context, intent)
Log.e("ErrorOnClick", "Button was clicked.");
}