תכונות 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 פריסת ברירת המחדל של השגיאה:
Glance מאפשר למפתחים לספק פריסה של XML כחלופה אם היצירה נכשלת. המשמעות היא שהייתה שגיאה בקוד של Compose. ממשק המשתמש של השגיאה מופיע גם אם יש שגיאה שלא תפסתם בקוד של האפליקציה.
class UpgradeWidget : GlanceAppWidget(errorUiLayout = R.layout.error_layout)
זהו פריסה סטטית שהמשתמשים לא יכולים ליצור איתה אינטראקציה, אבל היא מתאימה למקרה חירום.
הוספת פעולות לממשק המשתמש של שגיאות ברירת המחדל
החל מגרסה 1.1.0 של Glance, אפשר לשנות את קוד ברירת המחדל לטיפול בשגיאות ב-Glance. כך תוכלו להוסיף קריאות חזרה לפעולות במקרה של חריגה שלא תפסתם או שגיאה בהרכבה.
כדי להשתמש בתכונה הזו, משנים את ברירת המחדל של הפונקציה onCompositionError()
:
GlanceAppWidget.onCompositionError(
context: Context,
glanceId: GlanceId,
AppWidgetId: Int,
throwable: Throwable
)
בפונקציה הזו, Glance עובר ל-RemoteViews
API לטיפול בשגיאות.
כך אפשר לציין פריסות ורכיבי טיפול בפעולות באמצעות XML.
בדוגמאות הבאות מוסבר, שלב אחרי שלב, איך ליצור ממשק משתמש של שגיאה שכולל לחצן לשליחת משוב:
- כתיבת הקובץ 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>
- שינוי ברירת המחדל של הפונקציה
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)
}
- יצירת כוונה בהמתנה שמפנה אל
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)
}
- טיפול בכוונה ב-
GlanceAppWidgetReceiver
override fun onReceive(context: Context, intent: Intent) {
super.onReceive(context, intent)
Log.e("ErrorOnClick", "Button was clicked.");
}