Fehler mit Glance beheben

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

Try-Catch-Block um nicht kompostierbare Komponenten verwenden

In Compose sind keine Try-Catch-Blöcke um Composables herum zulässig. Sie können jedoch die restliche 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 = 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 aufgefangene Ausnahme oder ein Compose-Fehler auftritt, zeigt Glance ein standardmäßiges Fehlerlayout an:

Eine Fehlermeldung mit dem Fehlertyp und einem Vorschlag, wo Sie nachsehen können
Abbildung 1. Standard-Fehlerlayout 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, falls die Zusammensetzung fehlschlägt. Das bedeutet, dass im Code für die Zusammenstellung 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 statisch und Nutzer können nicht damit interagieren. Es eignet sich jedoch für Notfälle.

Enthält eine Überschrift und ein Textfeld, in dem eine Fehlermeldung angezeigt wird
Abbildung 3. Beispiel für ein benutzerdefiniertes Fehlerlayout

Der Standardfehleroberfläche Aktionen 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, falls eine nicht abgefangene Ausnahme oder ein Fehler bei der Zusammenstellung 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 bei der Fehlerbehandlung auf die RemoteViews API zurück. So können Sie Layouts und Aktionshandler 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.setAction("widgetError")
        return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_IMMUTABLE)
    }
    
    
  4. So verarbeiten Sie den Intent in Ihrem GlanceAppWidgetReceiver:

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