التعامل مع الأخطاء من خلال ميزة "نظرة سريعة"

يتم تضمين ميزات واجهة برمجة التطبيقات لتحسين التعامل مع الأخطاء في ميزة "نظرة سريعة" بدءًا من الإصدار 15 من نظام التشغيل Android توفّر هذه الصفحة بعض أفضل الممارسات بشأن واجهات برمجة التطبيقات هذه.

استخدام كتلة تجريبية حول المكوّنات غير القابلة للإنشاء

لا تسمح ميزة الإنشاء بدمج عناصر تجريبية، ولكنها تتيح لك التفاف العناصر. منطق تطبيقك الآخر في هذه الأقسام. يتيح لك هذا استخدام ComposeAllowed كما هو موضح في المثال التالي:

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.تنسيق الأخطاء التلقائي في Glance 1.0
مربّع يحتوي على النص "يتعذّر عرض المحتوى"
الشكل 2.التنسيق التلقائي للأخطاء في ميزة Glance 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
)

وفي هذه الوظيفة، تستخدم ميزة "نظرة سريعة" واجهة برمجة تطبيقات 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.");
}