Fehler mit Glance beheben

Ab Android 15 sind API-Funktionen zur Verbesserung der Fehlerbehandlung in Glance enthalten. Auf dieser Seite finden Sie Best Practices für diese APIs.

Verwenden Sie einen Try-Catch-Block um nicht zusammensetzbare Komponenten.

Compose lässt keine Try-Catch-Blöcke um zusammensetzbare Funktionen zu, aber Sie können die andere Logik Ihrer App in diese Blöcke einbinden. So können Sie Compose für Ihre Fehleransicht verwenden, wie im folgenden Beispiel gezeigt:

provideContent {
    var isError = false
    var data = listOf<String>()
    try {
        val repository = (context.applicationContext as MyApplication).myRepository
        data = repository.loadData()
    } catch (e: Exception) {
        isError = true
        // TODO: handle error
    }

    if (isError) {
        ErrorView()
    } else {
        Content(data)
    }
}

Standard-Fehlerlayout

Wenn eine nicht abgefangene Ausnahme oder ein Compose-Fehler auftritt, zeigt Glance ein Standardfehlerlayout an:

Eine Fehlermeldung, die den Fehlertyp und einen Vorschlag enthält, wo nach dem Fehler gesucht werden soll
Abbildung 1. Standard-Fehlerlayout von Glance 1.0
Ein Feld mit dem Text „Inhalt kann nicht angezeigt werden“
Abbildung 2. Glance 1.1.0 – Standardfehlerlayout

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

class UpgradeWidget : GlanceAppWidget(errorUiLayout = R.layout.error_layout) {
    // ...
}
Dieses Layout ist ein statisches Layout, mit dem der Nutzer nicht interagieren kann, das aber in Notfällen nützlich ist.

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

Aktionen zur Standard-Fehler-UI hinzufügen

Seit Glance 1.1.0 können Sie den Standardcode für die Fehlerbehandlung überschreiben. So können Sie Aktions-Callbacks für den Fall hinzufügen, dass eine nicht abgefangene Ausnahme oder ein Fehler in der Erstellung auftritt.

Überschreiben Sie die Funktion onCompositionError(), um dieses Feature zu verwenden:

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

In dieser Funktion greift Glance auf die RemoteViews API für die Fehlerbehandlung zurück. So können Sie Layouts und Aktions-Handler mit 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. Schreiben Sie die Datei 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>
    

  2. Überschreiben Sie die Funktion 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)
    }

  3. Erstellen Sie einen ausstehenden Intent, der auf Ihre GlanceAppWidgetReceiver verweist:

    private fun getErrorIntent(context: Context, throwable: Throwable): PendingIntent {
        val intent = Intent(context, UpgradeToHelloWorldPro::class.java)
        intent.action = "widgetError"
        return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_IMMUTABLE)
    }

  4. Verarbeiten Sie den Intent in Ihrer GlanceAppWidgetReceiver:

    override fun onReceive(context: Context, intent: Intent) {
        super.onReceive(context, intent)
        Log.e("ErrorOnClick", "Button was clicked.")
    }