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.

„try-catch“-Block um nicht zusammensetzbare Komponenten verwenden

In Compose sind keine „try-catch“-Blöcke um zusammensetzbare Komponenten zulässig. Sie können jedoch die andere Logik Ihrer App in diese Blöcke einschließen. So können Sie Compose für die 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)
    }
}

Standardfehlerlayout

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

Eine Fehlermeldung mit dem Fehlertyp und einem Vorschlag, wo Sie nach dem Fehler suchen können
Abbildung 1. Standardfehlerlayout von Glance 1.0
Ein Feld mit dem Text „Inhalt kann nicht angezeigt werden“
Abbildung 2. Standardfehlerlayout von Glance 1.1.0

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

class UpgradeWidget : GlanceAppWidget(errorUiLayout = R.layout.error_layout) {
    // ...
}
Dieses Layout ist ein statisches Layout, mit dem Nutzer nicht interagieren können. Es ist jedoch in Notfällen nützlich.

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 den Standardcode für die Fehlerbehandlung überschreiben. So können Sie Aktions-Callbacks hinzufügen, wenn eine nicht abgefangene Ausnahme oder ein Fehler in der Komposition auftritt.

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

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

In dieser Funktion greift Glance zur Fehlerbehandlung auf die RemoteViews API zurück. So können Sie Layouts und Aktionshandler mit XML angeben.

Die folgenden Beispiele zeigen Schritt für Schritt, 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 Ihren 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 Ihrem GlanceAppWidgetReceiver:

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