Bir Bakışta ile hataları ele alma

Android 15'ten itibaren, Glance'ta hata işleme sürecini iyileştirmeye yönelik API özellikleri eklendi. Bu sayfada, bu API'lerle ilgili bazı en iyi uygulamalar verilmiştir.

Birleştirilebilir olmayan bileşenlerin etrafında bir try-catch bloğu kullanın

Compose, bileşenler etrafında try-catch bloklarına izin vermez ancak uygulamanızın diğer mantığını bu bloklara sarmalamanıza olanak tanır. Bu sayede, aşağıdaki örnekte gösterildiği gibi hata görünümünüz için Oluştur'u kullanabilirsiniz:

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)
       }
   }

Varsayılan hata düzeni

Yakalanmamış bir istisna veya Oluşturma hatası varsa Glance, varsayılan hata düzenini gösterir:

Hata türünü gösteren hata mesajı ve hatanın nerede bulunabileceğine dair bir öneri
Şekil 1.Glance 1.0 varsayılan hata düzeni
"İçerik gösterilemiyor" metnini içeren bir kutu
Şekil 2.Glance 1.1.0 varsayılan hata düzeni

Bir Bakışta, geliştiricilerin kompozisyon başarısız olursa yedek olarak bir XML düzeni sağlamasına olanak tanır. Bu, Compose kodunda bir hata olduğu anlamına gelir. Bu hata kullanıcı arayüzü, uygulamanızın kodunda yakalanmamış bir hata varsa da gösterilir.

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

Bu düzen, kullanıcınızın etkileşimde bulunamayacağı statik bir düzendir ancak acil durumlarda kullanışlıdır.

Hata mesajı göstermek için bir başlık ve metin alanı içerir
Şekil 3.Örnek özel hata düzeni

Varsayılan hata kullanıcı arayüzüne işlem ekleme

Glance 1.1.0'dan itibaren Glance, varsayılan hata işleme kodunu geçersiz kılmanıza olanak tanır. Bu sayede, yakalanmayan bir istisna veya kompozisyonda hata olması durumunda işlem geri çağırma işlevleri ekleyebilirsiniz.

Bu özelliği kullanmak için onCompositionError() işlevini geçersiz kılın:

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

Bu işlevde Glance, hata işleme için RemoteViews API'ye geri döner. Bu sayede XML kullanarak düzenleri ve işlem işleyicileri belirtebilirsiniz.

Aşağıdaki örneklerde, geri bildirim göndermek için bir düğme içeren hata kullanıcı arayüzünün nasıl oluşturulacağı adım adım gösterilmektedir:

  1. error_layout.xml dosyasını yazın
<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>

  1. onCompositionError işlevini geçersiz kılma
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)
}

  1. GlanceAppWidgetReceiver öğenize referans veren bekleyen bir intent oluşturun
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)
}

  1. GlanceAppWidgetReceiver'ünüzde amacı işleme
override fun onReceive(context: Context, intent: Intent) {
   super.onReceive(context, intent)
   Log.e("ErrorOnClick", "Button was clicked.");
}