ویژگیهای میانای برنامهسازی کاربردی برای بهبود مدیریت خطا در Glance از Android 15 به بعد گنجانده شده است. این صفحه روالهای مطلوب را درباره این میاناهای برنامهسازی کاربردی ارائه میدهد.
از بلوک try-catch در اطراف مؤلفههای غیرقابلترکیب استفاده کنید
Compose اجازه نمیدهد بلوکهای try-catch در اطراف composableها قرار بگیرند، اما به شما اجازه میدهد منطق دیگر برنامهتان را در این بلوکها قرار دهید. این به شما امکان میدهد از Compose برای نمای خطای خود استفاده کنید، همانطور که در مثال زیر نشان داده شده است:
provideContent { var isError = false var data = listOf<String>() try { val repository = (context.applicationContext as MyApplication).myRepository data = repository.loadData() } catch (e: Exception) { isError = true // TODO: handle error } if (isError) { ErrorView() } else { Content(data) } }
چیدمان خطای پیشفرض
اگر استثنای غیرقابلکنترلی یا خطای Compose وجود داشته باشد، Glance یک چیدمان خطای پیشفرض نمایش میدهد:
Glance به توسعهدهندگان اجازه میدهد درصورت ناموفق بودن ترکیببندی، یک طرحبندی XML بهعنوان جایگزین ارائه دهند. این یعنی خطایی در کد Compose وجود داشته است. این میانای کاربر خطا همچنین اگر خطای گیرانداختهنشدهای در کد برنامهتان داشته باشید نشان داده میشود.
class UpgradeWidget : GlanceAppWidget(errorUiLayout = R.layout.error_layout) { // ... }
افزودن کنش به واسط کاربر خطای پیشفرض
از Glance نسخه ۱.۱.۰، Glance به شما امکان میدهد کد رسیدگی به خطای پیشفرض را لغو کنید. بهاینترتیب، میتوانید درصورت بروز استثنای گیرنیفتاده یا خطا در ترکیببندی، فراخوانهای کنش اضافه کنید.
برای استفاده از این ویژگی، تابع
onCompositionError() را لغو کنید:
GlanceAppWidget.onCompositionError(
context: Context,
glanceId: GlanceId,
appWidgetId: Int,
throwable: Throwable
)
در این تابع، Glance برای رسیدگی به خطا به میانای برنامهسازی کاربردی RemoteViews برمیگردد.
این کار به شما امکان میدهد طرحبندیها و گردانندههای کنش را بااستفاده از 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.action = "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.") }