HMS Kütüphaneleri Kullanırken Callbackleri Coroutines ile Nasıl Daha İyi Handle Edebiliriz?

Besir Karaoglu
Huawei Developers - Türkiye
2 min readMar 9, 2023
Callback Örneği

Giriş

Merhaba,

Android uygulamaları geliştirirken, veri almak için her zaman harici bir hizmete ihtiyaç duyarız. Buna örnek olarak veritabanlarını veya sunucuları verebiliriz. Bunun bir sonucu olarak, veri almak için uygulamalarımıza çeşitli SDK’ları entegre ediyoruz. Ve tüm bu kullandığımız SDKlar tek bir ortak noktaya sahip, result listenerlar. Her fonksiyon bloğu içinde tek bir işlem yapıyorsanız kullanımlarında hiçbir problem yok, peki ya birkaç işlem yapmanız gerekiyorsa? Yazılım dünyasında bunun için bir deyiş var, “Callback Cehennemi”. İhtiyaçlarınızı karşılamak için iç içe result listenerları(size aşağıda bir örnek göstereceğim) çağırmanız gerekir. Bu işlem, kodu çirkin hale getirir ve işlem sayısı arttıkça, handle etmeniz gereken condition sayısı da artacaktır. Bu hem kod yazarları hem de reviewerlar için yorucu olabilir. Bazı AGC SDKlarıyla çalışırken bu sorunla karşılaştım ve bu kadar çok listenerla uğraşmak beni bir çözüm arayışı içine soktu. Bu nedenle HMS ve AGC SDKları için callbackleri kolayca handle etmemizi sağlayan bir kütüphane derledim. Bu kütüphane sayesinde callback listenerlarımızı hem daha temiz, hem de thread bloklamayan bir versiyona dönüştürüyoruz. Bu durumu daha iyi anlamak için bir örnekle devam edelim.

Örnek

Bu örnekte, verileri sorguladığımız ve sonuçları aldığımız, alınan sonuçları tekrar veritabanına kaydettiğimiz, sonrasında da Cloud Functions’taki fonksiyonumuzu çağırdığımız bir senaryo hayal edelim. Bu işlemi callback listenerlar ile yapmak istediğimizde izleyeceğimiz yol aşağıdadır(Basitliği sağlamak adına gereksiz kod parçaları çıkarılmıştır).

Yukarıda gördüğümüz üzere, her kullandığımız callback için success ve failure durumlarını ayrı ayrı handle etmemiz gerekiyor. Buna uygulamamız özelinde eklediğimiz logic ve işlemleri de eklersek oldukça karışık ve yorucu bir kod elde etmiş oluruz.

Bu kütüphane ile yukarıdaki işlemleri şu şekilde yapabilirsiniz:

Sadece bu kadar. Daha temiz, daha kolay ve üstelik coroutineler ve flowlar ile uyumlu.

SDK’yı Entegre Etme

Project level build.gradle dosyasına(Gradle versiyonuna göre değişiklik gösterebilir):

App level build.gradle dosyasına:

kütüphanenin implementasyonunu ekleyip ardından projemizi sync ediyoruz. Tüm yapılması gerekenler bu kadar. Artık thread bloklamayan ve daha temiz fonksiyonlarımız kullanıma hazır :)

function screenshot

Sonuç

Bu yazımda bu kütüphanenin ne olduğunu ve neden ihtiyaç duyduğumuzu inceledik, bir örnekle farkı gördük ve entegrasyon adımlarını uyguladık. Kaynak repo veya örnekleri incelemek için Referanslar bölümüne göz atabilirsiniz.

İyi günler, sonraki yazılarda görüşmek üzere :)

Referanslar

--

--