با Glance خطاها را مدیریت کنید

ویژگی‌های 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. به طرح بندی خطای پیش فرض 1.0 نگاه کنید
کادری با متن "نمی توان محتوا را نشان داد"
شکل 2. طرح بندی خطای پیش فرض 1.1.0 را نگاه کنید

Glance به توسعه دهندگان این امکان را می دهد که در صورت شکست ترکیب، یک طرح XML را به عنوان بازگشتی ارائه کنند. این به این معنی است که در کد Compose خطایی وجود داشته است. در صورتی که در کد برنامه خود خطای کشف نشده داشته باشید، این رابط کاربری خطا نیز ظاهر می شود.

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

این چیدمان یک چیدمان ثابت است که کاربر شما نمی تواند با آن تعامل داشته باشد، اما در موارد اضطراری خوب است.

شامل یک عنوان و یک فیلد متنی برای نمایش پیام خطا است
شکل 3. نمونه طرح خطای سفارشی

اقدامات را به رابط کاربری خطای پیش‌فرض اضافه کنید

از Glance 1.1.0، 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.");
}