ویژگیهای 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 یک طرح خطای پیشفرض را نشان میدهد:
Glance به توسعه دهندگان این امکان را می دهد که در صورت شکست ترکیب، یک طرح XML را به عنوان بازگشتی ارائه کنند. این به این معنی است که در کد Compose خطایی وجود داشته است. در صورتی که در کد برنامه خود خطای کشف نشده داشته باشید، این رابط کاربری خطا نیز ظاهر می شود.
class UpgradeWidget : GlanceAppWidget(errorUiLayout = R.layout.error_layout)
این چیدمان یک چیدمان ثابت است که کاربر شما نمی تواند با آن تعامل داشته باشد، اما در موارد اضطراری خوب است.
اقدامات را به رابط کاربری خطای پیشفرض اضافه کنید
از Glance 1.1.0، Glance به شما امکان می دهد کد پیش فرض رسیدگی به خطا را لغو کنید. به این ترتیب، میتوانید در صورت بروز یک استثنا یا خطا در ترکیب، فراخوانهای عمل اضافه کنید.
برای استفاده از این ویژگی، تابع onCompositionError()
را لغو کنید:
GlanceAppWidget.onCompositionError(
context: Context,
glanceId: GlanceId,
AppWidgetId: Int,
throwable: Throwable
)
در این تابع، Glance برای مدیریت خطا به API 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)
}
- یک 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)
}
- هدف را در
GlanceAppWidgetReceiver
خود مدیریت کنید
override fun onReceive(context: Context, intent: Intent) {
super.onReceive(context, intent)
Log.e("ErrorOnClick", "Button was clicked.");
}