Bir Bakışta ile hataları ele alma

Glance'te hata işlemeyi iyileştiren API özellikleri, Android 15'ten itibaren kullanılabilir. Bu sayfada, bu API'lerle ilgili en iyi uygulamalar verilmiştir.

Oluşturulabilir olmayan bileşenlerin çevresinde try-catch bloğu kullanma

Compose, composable'ların 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 Compose'u kullanabilirsiniz:

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

Varsayılan hata düzeni

Yakalanmamış bir istisna veya Compose hatası varsa Glance, varsayılan bir hata düzeni gösterir:

Hatanın türünü gösteren bir hata mesajı ve hatayı nerede arayacağınıza dair bir öneri
Şekil 1. Glance 1.0 varsayılan hata düzeni
&quot;İçerik gösterilemiyor&quot; metnini içeren bir kutu
Şekil 2. Glance 1.1.0 varsayılan hata düzeni

Glance, geliştiricilerin oluşturma işlemi başarısız olursa yedek olarak 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örünür.

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, yakalanmamış bir istisna veya oluşturma hatası durumunda işlem geri çağırmaları 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'yi kullanır. Bu sayede, XML kullanarak düzenleri ve işlem işleyicileri belirtebilirsiniz.

Aşağıdaki örneklerde, geri bildirim gönderme düğmesi içeren bir 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>
    

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

  3. GlanceAppWidgetReceiver öğenize referans veren, beklemede olan bir intent oluşturun:

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

  4. GlanceAppWidgetReceiver uygulamanızda intent'i işleyin:

    override fun onReceive(context: Context, intent: Intent) {
        super.onReceive(context, intent)
        Log.e("ErrorOnClick", "Button was clicked.")
    }