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

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

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

פיתוח נייטיב לא מאפשר לתפוס בלוקים של תוכן קומפוזבילי, אבל הוא מאפשר לכלול את הלוגיקה האחרת של האפליקציה בבלוקים האלה. כך תוכלו להשתמש ב-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 כחלופה אם היצירה של התצוגה נכשלת. המשמעות היא שאירעה שגיאה בקוד הכתיבה. ממשק המשתמש של השגיאה מופיע גם אם יש שגיאה שלא תפסתם בקוד של האפליקציה.

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 חוזרת ל-API של RemoteViews לטיפול בשגיאות. כך אפשר לציין פריסות ורכיבי טיפול בפעולות באמצעות 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. יצירת Intent בהמתנה שמפנה אל 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.");
}