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

ویژگی‌های API برای بهبود مدیریت خطا در Glance از اندروید ۱۵ به بعد گنجانده شده‌اند. این صفحه بهترین شیوه‌ها را در مورد این 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 1.0
کادری با متن «نمایش محتوا امکان‌پذیر نیست»
شکل ۲. طرح‌بندی پیش‌فرض خطا در Glance 1.1.0

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

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

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

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

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

از نسخه ۱.۱.۰ به بعد، Glance به شما اجازه می‌دهد کد پیش‌فرض مدیریت خطا را نادیده بگیرید. به این ترتیب، می‌توانید در صورت بروز یک استثنا یا خطای ناشناخته در ترکیب، فراخوانی‌های اکشن اضافه کنید.

برای استفاده از این ویژگی، تابع onCompositionError() را بازنویسی کنید:

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

در این تابع، Glance برای مدیریت خطا به RemoteViews API مراجعه می‌کند. این به شما امکان می‌دهد طرح‌بندی‌ها و کنترل‌کننده‌های اکشن را با استفاده از 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.");
    }