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

بدءًا من Android 15، تتضمّن واجهة برمجة التطبيقات ميزات لتحسين معالجة الأخطاء على Glance. تقدّم هذه الصفحة أفضل الممارسات المتعلّقة بواجهات برمجة التطبيقات هذه.

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

لا يسمح Compose باستخدام كتل 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 كحلّ احتياطي في حال تعذّر الإنشاء. يعني ذلك أنّه حدث خطأ في رمز 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 إلى واجهة برمجة التطبيقات 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>
    
    
  2. ألغِ الدالة 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)
    }
    
  3. أنشئ هدفًا معلّقًا يشير إلى 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)
    }
    
    
  4. تعامَل مع الهدف في GlanceAppWidgetReceiver:

    override fun onReceive(context: Context, intent: Intent) {
       super.onReceive(context, intent)
       Log.e("ErrorOnClick", "Button was clicked.");
    }