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

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

השתמשו בבלוק 'התנסות' סביב רכיבים לא קומפוזביליים

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

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

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

אם יש חריג לא זוהה או שגיאת כתיבה, התכונה 'בקצרה' תציג פריסת השגיאה שמוגדרת כברירת מחדל:

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

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

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

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

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

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

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

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

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

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