Fehler mit Glance beheben

API-Funktionen zur Verbesserung der Fehlerbehandlung in Glance sind ab Android 15 enthalten. Auf dieser Seite finden Sie einige Best Practices zu diesen APIs.

Einen Try-Catch-Block für nicht zusammensetzbare Komponenten verwenden

Bei „Compose“ sind keine Try-Catch-Blöcke um zusammensetzbare Funktionen zulässig, Sie können aber die andere Logik Ihrer Anwendung in diesen Blöcken zusammenfassen. Auf diese Weise können Sie „Compose“ für die Fehleransicht verwenden, wie im folgenden Beispiel gezeigt:

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

Standard-Fehlerlayout

Wenn eine nicht abgefangene Ausnahme oder ein Fehler beim Schreiben vorhanden ist, zeigt Glance ein Standardfehlerlayout an:

Eine Fehlermeldung mit der Art des Fehlers und einem Vorschlag, wo Sie danach suchen können
Abbildung 1:Glance 1.0-Standardfehlerlayout
Ein Feld mit dem Text „Inhalte können nicht angezeigt werden“
Abbildung 2:Glance 1.1.0 – Standardfehlerlayout

Mit Glance können Entwickler ein XML-Layout als Fallback bereitstellen, wenn die Erstellung fehlschlägt. Dies bedeutet, dass im Compose-Code ein Fehler aufgetreten ist. Diese Fehler-UI wird auch angezeigt, wenn im Code Ihrer Anwendung ein nicht abgefangener Fehler vorhanden ist.

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

Dieses Layout ist ein statisches Layout, mit dem die Nutzer nicht interagieren können, das sich aber für Notfälle eignet.

Enthält eine Überschrift und ein Textfeld zum Anzeigen einer Fehlermeldung
Abbildung 3: Beispiel für ein benutzerdefiniertes Fehlerlayout

Aktionen zur Standardfehler-UI hinzufügen

Ab Glance 1.1.0 können Sie mit Glance den Standardcode zur Fehlerbehandlung überschreiben. So können Sie Aktions-Callbacks hinzufügen, wenn eine nicht abgefangene Ausnahme oder ein Fehler bei der Zusammensetzung auftritt.

Wenn Sie diese Funktion verwenden möchten, überschreiben Sie die Funktion onCompositionError():

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

In dieser Funktion greift Glance zur Fehlerbehandlung auf die RemoteViews API zurück. Dadurch können Sie Layouts und Aktions-Handler mithilfe von XML angeben.

In den folgenden Beispielen wird Schritt für Schritt gezeigt, wie Sie eine Fehler-UI mit einer Schaltfläche zum Senden von Feedback erstellen:

  1. Datei „error_layout.xml“ schreiben
<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. onCompositionError-Funktion überschreiben
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. Ausstehenden Intent erstellen, der auf GlanceAppWidgetReceiver verweist
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. Intent in GlanceAppWidgetReceiver verarbeiten
override fun onReceive(context: Context, intent: Intent) {
   super.onReceive(context, intent)
   Log.e("ErrorOnClick", "Button was clicked.");
}