Room ile Coroutine Birlikte Nasıl Kullanılabilir?
Android Jetpack Kütüphanelerinden olan Room u Coroutine i birlikte kullanarak işlemlerimizi nasıl daha komplike ve hızlı bir şekilde yapabileceğimizi ,veritabanımızdan ilgili uuid ye sahip kullanıcının bilgilerini çekeceğimiz bir örnek üzerinden anlatmaya çalışacağım.
Kodlama kısmından önce kullanacağımız kütüphaneleri ve bağlantıları belirtmemiz gerek.
Gradle (uygulama) oluşturun
Bağımlılıklar
Verilerimizi görünteleyeceğimiz fragment_country yapısı.
Kodlamamızı bu sırayı takip ederek devam edeceğiz:
1-Model
2-Servis
3-ViewModel
4-Fragment
1-Model
@Entity : SQLite içerisinde bizim için haritalandırma yapar. Entity içerisinde Tablo ismi verebiliriz belirtmezsek class adı ile tanımlanacaktır.
@ColumnInfo : Tabloda ki sütün adlarını name parametresi ile belirleyebiliriz.Bu alanı belirtmezsek columnInfo değişken adında oluşturulur.
@PrimaryKey : Her bir veriye ulaşmak için unique değeri tutan ,tablomuzda birincil anahtarı tanımlar.Ayrıca tablo da her satırın otomatik artması için autoGenerate parametresine true değerini veriyoruz.
2-Servis ( Veri Erişim Nesnesi ve Veritabanı)
DAO
Oluşturduğumuz bu arayüzün metotlarını Coroutine ler içerisinde çağırdığımız takdirde ana thread in dışında farklı bir thread de bu
işlemlerin yapılmasını garanti altına almış oluyoruz. Coroutine ler
bu işlemi bizim için kolay bir hale getiriyor.
Coroutine,uzun süren işlemler gerçekleştirilirken main thread i
bloklamadan farklı thread lerde işlem yapmamıza olanak sağlıyor.
Suspend Fun, Coroutine içerisinde çalıştırılabilen gerektiğinde durdurulup
sonra devam ettirilebilen fonksiyonlardır. Bu fonksiyonları sadece
farklı bir suspend fun da veya coroutine ler içerisinde çalıştırabilirsiniz.
VERİTABANI
Veritabanın dan bir den fazla obje oluşturulmasını istemiyoruz.Çünkü
farklı zamanlarda veya aynı zamanda farklı thread ler den veritabanına ulaşıldığı takdirde bir çakışmaya neden olacaktır.Bu yüzden
oluşturulan Database için Singleton mantığını kullanacağız.
Singleton ,içerisinden tek bir obje oluşturulan bir sınıftır.Eğer obje
yoksa oluşturuluyor varsa oluşturulmadan var olan obje geri döndürülüyor.
Companion object , static bir şekilde değişken oluşturup bu sınıfın dışında
her yerden ulaşmamıza olanak tanıyor.
@Volatile :Herhangi bir property veya değişkeni volatile olarak tanımladığımız takdirde farklı threadler den ulaşılması sağlanıyor. Coroutine kullanmasaydık volatile a ihtiyacımız olmayacaktı.
Synchronized , birden fazla thread in aynı anda erişimini kısıtlıyor.Instance ın olup olmadığını invoke fonksiyonu ile kontrol edip Instance var ise geri döndürüp yok ise makeDatabase fonksiyonu ile veritabanı oluşturuluyor.
Class’ ayrıca RoomDatabase() den extend ettiğimize dikkat edelim.
3-ViewModel
CoroutineScope u extend edeceğimiz BaseViewModel adında yeni bir class oluşturuyoruz.Örneğimiz için CountryViewModel a ,CoroutineScope extend edebilirdik fakat birden fazla ViewModel ın olduğu takdirde bu işlem kod tekrarına neden olacaktı.
job ile arkaplan da yapılacak işi tanımlıyoruz. CoroutineContext ile iş yapıldıktan sonra main thread e döneceğini belirtiyoruz.
launch ile yeni bir coroutine oluşturuluyor.Güncel thread i bloklamadan bir job a ihtiyaç duyuyor. Job iptal olduğu takdirde coroutine de iptal ediliyor. Threading işlemi bizim için kolay hale geliyor.
countryList değişkenini MutableLiveData olarak tanımladıktan sonra dao dan dönen country i countryList e atıyoruz.Böylelikle canlı olarak veri değişikliği sağlanıyor.
MutableLiveData değiştirilebilen canlı veriyi tanımlar.Liste üzerinde değişiklikler yapacağımız için tanımlamamızı bu şekilde gerçekleştirdik.
4- Fragment
LiveData observe kullanarak CountryViewModel da oluşturduğumuz countryList değişkenini gözlemliyoruz.Böylelikle yapılan değişikler otomatik olarak algılanması sağlanıyor. Textview larda hangi verilerin gösterileceğini belirtip örneğimizi tamamlıyoruz.
Room ile Coroutine birlikte nasıl kullanılabileceğini anlatmaya çalıştım umarım faydalı olmuştur.