Fitur API untuk meningkatkan penanganan error di Glance disertakan mulai Android 15. Halaman ini memberikan praktik terbaik terkait API ini.
Menggunakan blok try-catch di sekitar komponen non-composable
Compose tidak mengizinkan blok try-catch di sekitar composable, tetapi memungkinkan Anda menggabungkan logika aplikasi lainnya dalam blok ini. Hal ini memungkinkan Anda menggunakan Compose untuk tampilan error, seperti yang ditunjukkan dalam contoh berikut:
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) } }
Tata letak error default
Jika ada pengecualian yang tidak tertangkap atau error Compose, Glance akan menampilkan tata letak error default:
Glance memungkinkan developer menyediakan tata letak XML sebagai pengganti jika komposisi gagal. Artinya, ada error dalam kode Compose. UI error ini juga muncul jika Anda memiliki error yang tidak tertangkap dalam kode aplikasi.
class UpgradeWidget : GlanceAppWidget(errorUiLayout = R.layout.error_layout) { // ... }
Menambahkan tindakan ke UI error default
Mulai Glance 1.1.0, Glance memungkinkan Anda mengganti kode penanganan error default. Dengan begitu, Anda dapat menambahkan callback tindakan jika terjadi pengecualian atau error yang tidak tertangkap dalam komposisi.
Untuk menggunakan fitur ini, ganti fungsi
onCompositionError():
GlanceAppWidget.onCompositionError(
context: Context,
glanceId: GlanceId,
appWidgetId: Int,
throwable: Throwable
)
Dalam fungsi ini, Glance kembali ke RemoteViews API untuk penanganan error.
Hal ini memungkinkan Anda menentukan tata letak dan pengendali tindakan menggunakan XML.
Contoh berikut menunjukkan langkah demi langkah cara membuat UI error yang menyertakan tombol untuk mengirim masukan:
Tulis file
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>Ganti fungsi
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) }
Buat intent tertunda yang mereferensikan
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) }
Tangani intent di
GlanceAppWidgetReceiver:override fun onReceive(context: Context, intent: Intent) { super.onReceive(context, intent) Log.e("ErrorOnClick", "Button was clicked.") }