טיפול בשגיאות באמצעות התכונה 'בקצרה'

תכונות API לשיפור הטיפול בשגיאות ב-Glance כלולות החל מגרסה Android 15. בדף הזה מפורטות כמה שיטות מומלצות לגבי ממשקי ה-API האלה.

שימוש בבלוק try-catch סביב רכיבים שלא ניתן לשלב

ב-Compose אסור להשתמש בבלוק try-catch סביב רכיבי composable, אבל אפשר לעטוף את הלוגיקה האחרת של האפליקציה בבלוק כזה. כך תוכלו להשתמש ב-Compose בתצוגת השגיאה, כפי שמוצג בדוגמה הבאה:

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

פריסת השגיאה שמוגדרת כברירת מחדל

אם יש חריגה שלא תפסה או שגיאה ב-Compose, תופיע ב-Glance פריסת ברירת המחדל של השגיאה:

הודעת שגיאה עם סוג השגיאה והצעה לאיפה לחפש אותה
איור 1.פריסת השגיאות שמוגדרת כברירת מחדל ב-Glance 1.0
תיבה עם הטקסט 'לא ניתן להציג את התוכן'
איור 2.פריסת השגיאות שמוגדרת כברירת מחדל ב-Glance 1.1.0

Glance מאפשר למפתחים לספק פריסה של XML כחלופה אם היצירה נכשלת. המשמעות היא שהייתה שגיאה בקוד של Compose. ממשק המשתמש של השגיאה מופיע גם אם יש שגיאה שלא תפסתם בקוד של האפליקציה.

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

זהו פריסה סטטית שהמשתמשים לא יכולים ליצור איתה אינטראקציה, אבל היא מתאימה למקרה חירום.

מכיל כותרת ושדה טקסט להצגת הודעת שגיאה
איור 3.דוגמה לפריסה מותאמת אישית של שגיאה

הוספת פעולות לממשק המשתמש של שגיאות ברירת המחדל

החל מגרסה 1.1.0 של Glance, אפשר לשנות את קוד ברירת המחדל לטיפול בשגיאות ב-Glance. כך תוכלו להוסיף קריאות חזרה לפעולות במקרה של חריגה שלא תפסתם או שגיאה בהרכבה.

כדי להשתמש בתכונה הזו, משנים את ברירת המחדל של הפונקציה onCompositionError():

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

בפונקציה הזו, Glance עובר ל-RemoteViews API לטיפול בשגיאות. כך אפשר לציין פריסות ורכיבי טיפול בפעולות באמצעות XML.

בדוגמאות הבאות מוסבר, שלב אחרי שלב, איך ליצור ממשק משתמש של שגיאה שכולל לחצן לשליחת משוב:

  1. כתיבת הקובץ 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>

  1. שינוי ברירת המחדל של הפונקציה 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)
}

  1. יצירת כוונה בהמתנה שמפנה אל 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)
}

  1. טיפול בכוונה ב-GlanceAppWidgetReceiver
override fun onReceive(context: Context, intent: Intent) {
   super.onReceive(context, intent)
   Log.e("ErrorOnClick", "Button was clicked.");
}