- Ana yürütme iş parçacığı ile arka plan iş parçacıkları arasındaki temel fark, arayüz engellemesini önlemektir.
- Eşzamansız işlemleri verimli ve hafif bir şekilde yönetmek için modern standart olarak eşzamanlı işlemlerin (coroutines) uygulanması.
- Ana iş parçacığının güvenliğini sağlamak ve bellek sızıntılarını önlemek için dağıtıcıların ve yürütme kapsamlarının kullanımı.

Android geliştirme dünyasına girdiğimizde, en yaygın zorluklardan biri, zorlu görevler gerçekleştirirken uygulamanın donmasını önlemektir. Bunu çözmek için, teknik olarak iş parçacıkları (thread) olarak bilinen yürütme süreçlerinin nasıl çalıştığını anlamak çok önemlidir . Bu iş parçacıkları, temelde işlemcinin bir dizi talimatı yürütmek için izlediği yoldur.
Kotlin hayatımızı çok kolaylaştırsa da, bu akışları düzgün yönetmezsek, korkulan Uygulama Yanıt Vermiyor (ANR) hatasıyla karşılaşma riskiyle karşı karşıya kalırız . Bu nedenle, arayüzü oluşturan iş parçacığı ile arka planda sessizce çalışan iş parçacıkları arasında ayrım yapmak ve böylece kullanıcı deneyimini optimize etmek hayati önem taşır.
Kotlin ekosisteminde iş parçacığı (thread) kavramı

Temel bilgilerle başlayalım: Bir iş parçacığı, bir işlemcinin işleyebileceği en küçük yürütme birimidir. Kotlin'de, herhangi bir uygulama en az bir ana iş parçacığıyla başlar ; bu iş parçacığı genellikle giriş noktasını, yani main() fonksiyonunu yönetmekten sorumludur. Bu iş parçacığı uygulamanın kalbidir ve yaşam döngüsü genel süreçle bağlantılıdır; bu iş parçacığı ölürse, çalışan diğer iş parçacıklarının sayısına bakılmaksızın tüm uygulama sonlanır.
Temel kural, tek bir iş parçacığı içinde aynı anda yalnızca bir komutun yürütülebilmesidir . Bu, çok uzun süren bir görevi (örneğin büyük bir dosya indirme) başlattığınızda, iş parçacığının bloke olacağı ve bitene kadar başka hiçbir şey yapamayacağı anlamına gelir. Kullanıcının uygulamanın çöktüğünü düşünmesini önlemek için Kotlin, birden fazla eş zamanlı iş parçacığı oluşturulmasına izin verir ; bu sayede kaynak yoğun görevler ikincil iş parçacıklarına devredilirken ana iş parçacığı kullanıcı tıklamalarına yanıt vermeye devam eder.
Eş zamanlı işlemler: Asenkronluğun evrimi

Geleneksel iş parçacıkları çalışsa da, kaynak yoğunluğu yüksektir. İşte burada, Kotlin'in 1.3 sürümünde asenkron kodu basitleştirmek için tanıtılan bir tasarım deseni olan eş zamanlı işlemler (coroutines) devreye giriyor . Ağır iş parçacıkları oluşturmak yerine, eş zamanlı işlemler, üzerinde çalıştıkları kaynağı engellemeden askıya alınabilen ve devam ettirilebilen "hafif iş parçacıkları" gibidir.
Eş zamanlı işlemlerin (coroutines) kullanımının birçok avantajı vardır: Birincisi, son derece hafiftirler ve cihaz belleğini tüketmeden binlerce işlemin başlatılmasına olanak tanırlar. İkincisi, yapılandırılmış eşzamanlılık sayesinde, tanımlanmış bir kapsam içinde çalışırlar ve bellek sızıntılarını önemli ölçüde azaltırlar. Ayrıca, hiyerarşi boyunca yayılan otomatik bir iptal sistemiyle birlikte gelirler ve Jetpack kütüphaneleriyle sorunsuz bir şekilde entegre olurlar.
Pratik uygulama ve ana iş parçacığı güvenliği

Android'de, bir fonksiyonun ana iş parçacığı için güvenli olduğunu, kullanıcı arayüzü güncellemesini kesintiye uğratmadığında söyleriz. Senkronize ağ isteği yapan bir fonksiyonumuz varsa, kullanıcı arayüzünü bloke edecektir. Bunu düzeltmek için, yürütmeyi giriş/çıkış görevleri için optimize edilmiş bir iş parçacığına taşıyan `withContext(Dispatchers.IO)` fonksiyonunu kullanırız.
Bunun çalışması için fonksiyonun `suspend` anahtar kelimesiyle işaretlenmesi gerekir. Askıya alınmış bir fonksiyon iş parçacığını bloke etmez; bunun yerine, sonuç hazır olana kadar iş parçacığını "durdurur" ve diğer görevler için serbest bırakır. Her askıya alınmış fonksiyonun bir eş zamanlı işlem (coroutine) içinde yürütülmesi gerektiğini hatırlamak çok önemlidir .
Kapsam Yönetimi ve Sevk Görevlileri
Bu eşzamanlı işlemleri başlatmak için bir kapsama alanına veya CoroutineScope'a ihtiyacımız var. Modern Android geliştirmede, ViewModelScope mükemmel bir araçtır, çünkü ViewModel'in yaşam döngüsüne bağlıdır. Kullanıcı ekrandan ayrılırsa ve ViewModel yok edilirse, ilgili tüm eşzamanlı işlemler otomatik olarak iptal edilir ve pil tüketen hayalet işlemlerin önüne geçilir.
Kodun nerede çalıştırılacağına ilişkin kontrol, şu yollarla sağlanır: Görevlendiriciler. iken Dispatchers.Main Arayüzden sorumlu kişidir. Dispatchers.IO Ağlar veya veritabanları için uygun olanıdır. Ana iş parçacığında bir eş zamanlı işlem başlatırsak, şunu kullanarak: viewModelScope.launch ve içeride askıya alınmış bir fonksiyonu çağırıyoruz. withContext(Dispatchers.IO)İşlem arka plan iş parçacığına geçecek ve tamamlandığında, Otomatik olarak ana iş parçacığına geri dönecektir. Sonucu kullanıcıya göstermek.
Asenkron ortamlarda hata yönetimi
Ağ istekleriyle ilgili her şey sorunsuz ilerlemez, bu nedenle istisnaları ele almak çok önemlidir. Kotlin'de bunu yapmanın en basit ve doğal yolu, askıya alınan çağrıyı bir try-catch bloğuna sarmaktır . Bu şekilde, depo katmanındaki beklenmedik herhangi bir hata yakalanabilir ve kullanıcı arayüzünün kullanıcıya kullanıcı dostu bir şekilde iletebileceği bir hata durumuna dönüştürülebilir.
İyi yönetilen iş parçacıkları, akıllıca kullanılan askıya alınmış eşzamanlı işlemler ve uygun dağıtıcı tahsisi kombinasyonu, Android uygulamalarının akıcı ve verimli olmasını sağlar. Ağır görevleri arka plan süreçlerine devrederek ve ana iş parçacığını yükten arındırarak, son kullanıcı deneyiminden ödün vermeden donanım kaynaklarından en iyi şekilde yararlanan sağlam bir yazılım elde ederiz.