Uygulama Sürekli Yanıt Vermiyor Hatası

Telefon arızaları, çözüm rehberleri, teknik destek ve güncel bilgiler. Sorununuzu paylaşın, uzman topluluktan adım adım çözüm alın.

TealAgate

Kayıtlı Kullanıcı
Puan 0
Çözümler 0
Katılım
26 Tem 2026
Mesajlar
553
Tepkime puanı
0
TealAgate
Sürekli yanıt vermeyen uygulama hatası, kullanıcı deneyimini ciddi şekilde zedeleyerek müşteri memnuniyetini düşürüyor ve işletmelerin itibarını olumsuz etkiliyor. Android ve iOS platformlarında farklı mekanizmalarla tetiklenen bu hatanın kökeni genellikle UI thread’inin bloklanması, bellek sızıntıları, uzun süren ağ istekleri ya da performans darboğazlarıdır. Kullanıcılar uygulamayı kapatmak zorunda kalmadan önce birkaç saniye içinde “uygulama yanıt vermiyor” ekranını gördüğünde, uygulamanın geri dönüş süresi kritiktir. Üstelik, bu sorun doğrudan depolama, işlemci kullanım oranı ve ağ bant genişliği gibi sistem kaynaklarıyla da bağlantılıdır.

Bu makalede, “uygulama yanıt vermiyor” hatasının temel kavramlarını, tarihsel gelişimini ve güncel durumunu ele alacağız. Uzman görüşleriyle desteklenen pratik uygulama önerileri, gerçek hayat örnekleriyle zenginleştirilen detaylı alt başlıklar ve sıkça sorulan sorulara yanıtlar sunarak, geliştiricilerin bu hatayı tanıma, izleme ve düzeltme süreçlerini sistematik bir şekilde rehberlik edecektir. Hedefimiz, hem yeni başlayan hem de deneyimli iOS ve Android geliştiricilerine, uygulama performansını optimize etmeleri için somut adımlar sunmaktır.

Temel Kavramlar ve Tanım​

“Uygulama yanıt vermiyor” hatası, bir uygulamanın ana iş parçacığı (UI thread) üzerinde uzun süreli blokaj gerçekleştiğinde işletim sisteminin tetiklediği bir uyarıdır. Android’de bu durum ANR (Application Not Responding) olarak adlandırılırken, iOS’de Watchdog mekanizması benzer bir davranış sergiler. Kısacası, bir işlem 5 saniyeden (Android) ya da 10 saniyeden (iOS) uzun sürerse işletim sistemi kullanıcıya “uygulama yanıt vermiyor” mesajını gösterir.

Bu hatanın kökeninde genellikle üç ana faktör bulunur: 1) UI thread’inin bloklanması, 2) bellek sızıntıları veya aşırı bellek tüketimi, 3) ağ isteklerinin uzun süre bekletilmesi. Örneğin, bir Android uygulamasında veri tabanından büyük bir veri seti çekip bunu UI thread üzerinde işlemek, sistemin ANR sınırını hızla aşar. Benzer şekilde, iOS’da uzun süren bir ağ isteği, Watchdog’un 10 saniyelik eşik değerini aşmadan önce uygulamayı sonlandırmasına yol açar.

Performans izleme araçları, bu tür blokajları tespit etmek için kritik bir rol oynar. Android Studio Profiler, UI thread’in kullanımını, CPU, bellek ve ağ aktivitelerini gerçek zamanlı olarak gösterirken, iOS Instruments’ı da benzer veri setlerini sunar. Bu araçlar, geliştiricilere uygulama akışının hangi noktalarında gecikmeler yaşandığını görsel olarak ortaya koyarak, hatanın kökenine hızlıca ulaşma imkanı tanır.

ANR (Application Not Responding) Nasıl Oluşur?​

Android işletim sistemindeki ANR, bir uygulamanın ana iş parçacığında 5 saniyeden uzun süreli bir blokaj gerçekleştiğinde otomatik olarak tetiklenir. Bu süre içinde kullanıcı etkileşimi beklenir; eğer uygulama yanıt veremezse Android, kullanıcıya “uygulama yanıt vermiyor” ekranını gösterir ve kullanıcıya uygulamayı kapatma seçeneği sunar.

ANR’nin en yaygın nedeni, UI thread’inde uzun süren işlemlerin (örneğin, büyük dosya okumak, karmaşık hesaplamalar yapmak veya yoğun veri tabanı sorguları) doğrudan yürütülmesidir. Örneğin, bir “ListView”’da 10.000 satırdan oluşan bir veri kümesini doğrudan UI thread üzerinde sı
örneğin, bir “ListView”’da 10.000 satırdan oluşan bir veri kümesini doğrudan UI thread üzerinde sıralamak, 5 saniyelik ANR sınırını aşar ve sistem “uygulama yanıt vermiyor” ekranını gösterir. Bu tür senaryolarda, veri işleme işlemlerini ayrı bir iş parçacığı (AsyncTask, Thread, Executor) veya modern arayüzler (Kotlin Coroutines, RxJava) ile yönetmek gerekir.

İş Parçacığı (Thread) Yönetimi​

Ana iş parçacığı, kullanıcı arayüzü ile doğrudan etkileşime girer; bu yüzden üzerinde uzun süren işlemler yapılmamalıdır. Geliştiriciler, veri çekme, dosya okuma ve yoğun hesaplama görevlerini arka plan iş parçacıklarına taşıyarak UI thread’in serbest kalmasını sağlar. Android’de `HandlerThread`, `ExecutorService`, `LiveData` ve `ViewModel` gibi bileşenler, bu ayrımı kolaylaştırır. Örneğin, `ViewModel` içinde `MutableLiveData` nesneleri, uzun süren veri çekme işlemlerini `viewModelScope.launch` içinde Coroutine ile gerçekleştirebilir.

İş parçacığı yönetimi sadece performansı artırmakla kalmaz, aynı zamanda ANR riskini de azaltır. `StrictMode` sınıfı, UI thread’deki uzun süren blokajları derleme zamanında tespit eder. Geliştiriciler, `StrictMode.ThreadPolicy` ile `detectNetwork()` ve `detectDiskWrites()` gibi kuralları etkinleştirerek, ağ ve disk işlemlerinin UI thread içinde gerçekleşmesini önleyebilir.

Bellek Yönetimi ve Önbellekleme​

Bellek sızıntıları, özellikle Java’da nesne referanslarının yanlış yönetilmesiyle ortaya çıkar. Örneğin, bir `Activity` içinde büyük bitmap’ler saklandığında ve `onDestroy()` içinde serbest bırakılmadığında, eski `Activity` örnekleri garbage collector tarafından temizlenemez ve bellek dolabilir. Bu durum, yeni bir `Activity` başlatıldığında ANR’nin tetiklenmesine yol açar.

Bellek yönetimini kolaylaştırmak için `BitmapFactory.Options` ile `inSampleSize` kullanarak resmi ölçeklendirmek, `LruCache` ile sık kullanılan verileri önbelleğe almak gerekir. Android’in `FragmentTransaction`’ları, `Fragment`’lerin `setRetainInstance(true)` ile yaşam döngüsü yönetimini optimize eder. Ayrıca, `LeakCanary` gibi kütüphaneler, bellek sızıntılarını otomatik olarak tespit eder ve geliştiricilere rapor sunar.

Ağ İstekleri ve Zaman Aşımı​

Uzun süren ağ istekleri, özellikle yavaş bağlantı koşullarında ANR’nin sık karşılaşılan nedenlerinden biridir. Android’de `HttpURLConnection` veya `OkHttpClient` gibi kütüphaneler, zaman aşımı değerlerini (connect timeout, read timeout) özelleştirmenizi sağlar. En az 10 saniyelik bir read timeout, ANR’nin tetiklenmesini önleyebilir.

iOS tarafında, `URLSession`’in `timeoutIntervalForRequest` ve `timeoutIntervalForResource` parametreleri benzer bir işlev görür. Örneğin, 15 saniyelik bir `timeoutIntervalForRequest` ile, ağ gecikmesi yüksek olsa bile uygulama “uygulama yanıt vermiyor” ekranına geçmez. Ayrıca, `NSURLSessionDownloadTask`’i kullanarak büyük dosya indirmeleri, UI thread’in bloklanmasını engeller.

Ağ isteklerini asenkron yapmanın yanı sıra, veriyi cachelemek için `Cache-Control` başlıklarını kullanmak, aynı veriyi tekrar tekrar çekmekten kaçınır ve performansı artırır.

Performans Ölçüm Araçları​

Android Studio Profiler, CPU, bellek ve ağ kullanımını gerçek zamanlı olarak gösterir. Özellikle “CPU Profiler” sekmesi, hangi yöntemlerin UI thread’inde çalıştığını ve ne kadar süre harcadığını gösterir. `ANR` olayının anlaşılamayan bir noktasında, “Call Stack” görünümü, hangi iş parçacığında neyin çalıştığını hızlıca tespit eder.

iOS’da Instruments, “Time Profiler” ile benzer bilgiler sunar. “Allocations” raporu, bellek kullanımını izlerken “Network” raporu, HTTP istek sürelerini gösterir. Bu araçlar, geliştiricilerin kodda hangi bölümlerin performans darboğazına yol açtığını belirlemesine yardımcı olur.

Gerçek Dünya Örnekleri​

Bir e-ticaret uygulamasında, ürün listesi sayfasında 500 ürünün görüntülenmesi için ürün bilgileri sunucudan çekilir. UI thread’de doğrudan JSON’ı ayrıştırmak, 7 saniyelik ANR’ye sebep olur. Bu sorunun çözümü, `CoroutineScope` içinde `Dispatchers.IO` kullanarak JSON ayrıştırmasını arka plan’da yapmak ve sonucunu `LiveData` ile UI’ye iletmektir.

Bir haber uygulamasında, büyük görsellerin her sayfada tek bir kez yüklenmesi gerekir. `Glide` veya `Coil` kütüphaneleri, belleği yönetmek için otomatik önbellekleme sağlar. Ancak, eski sürümlerinde `Bitmap`’lerin yanlış yönetimi nedeniyle bellek dolması, uygulamanın aniden kapanmasına yol açar.

Bir oyun uygulamasında, çok sayıda animasyon ve fizik hesaplaması UI thread’inde yapılırsa, 60 fps hedefi bozulur ve kullanıcı “uygulama yanıt vermiyor” ekranını görür. Bu durumda, `Choreographer` ile frame callback’leri yönetmek ve ağır hesaplamaları `RenderThread` içinde gerçekleştirmek gerekir.

Uzman Önerileri ve İpuçları​

1. Her zaman UI thread’i boş tutun – Veri çekme, disk okuma ve uzun süreli hesaplamaları asenkron iş parçacıklarında yapın.
2. StrictMode’u etkinleştirin – Geliştirme aşamasında, `detectNetwork()` ve `detectDiskWrites()` kurallarını kullanarak UI thread’deki blokajları erken tespit edin.
3. Bellek sızıntılarını izleyin – `LeakCanary` gibi kütüphanelerle, nesne referanslarını takip edin ve `onDestroy()` içinde temizlemeyi unutmayın.
4. Ağ isteklerine zaman aşımı ekleyin – En az 10 saniyelik timeout ile, ağ gecikmesi yüksek olsa bile ANR oluşmasını engelleyin.
5. İş parçacığı havuzları kullanın – `ExecutorService` veya `CoroutineDispatcher` ile iş parçacığı havuzu oluşturun, böylece kaynakları verimli kullanın.
6. Veriyi önbellekle – `LruCache`, `Room` veya `SQLite` ile sık kullanılan verileri saklayın, böylece ağ isteklerini azaltın.
7. Profil araçlarını kullanın – Android Studio Profiler ve iOS Instruments ile performans darboğazlarını tespit edin.
8. Karmaşık hesaplamaları izole edin – Matematiksel işlemleri, `RenderScript` veya `OpenGL ES` gibi GPU tabanlı çözümlere taşıyın.
9. Yüksek çözünürlüklü görselleri ölçeklendirin – `BitmapFactory.Options.inSampleSize` ile belleği koruyun.
10. Kod gözden geçirmeleri yapın – Özellikle UI thread’de yapılan işlemleri kontrol edin, kodunuzu eş zamanlı iş parçacığı yönetimi konusunda gözden geçirin.

Sıkça Sorulan Sorular​

Android’de ANR ne kadar sürede tetiklenir?​

Android’de ANR, UI thread’inin 5 saniyeden uzun süre bloklanması durumunda tetiklenir.

iOS Watchdog ne zaman uygulamayı sonlandırır?​

iOS Watchdog, UI thread’in 10 saniyeden uzun süre yanıt vermemesi durumunda uygulamayı sonlandırır.

ANR hatasını önlemek için hangi kütüphaneler kullanılır?​

`Coroutine`, `RxJava`, `OkHttp`, `Glide`, `Coil` ve `LeakCanary` gibi kütüphaneler, asenkron yapılandırma ve bellek yönetimi için yaygın olarak kullanılır.

Uygulama yanıt vermiyor hatasını nasıl gideririm?​

UI thread’deki blokajları ortadan kaldırın, ağ isteklerine zaman aşımı ekleyin, bellek sızıntılarını temizleyin ve profil araçlarını kullanarak darboğazları tespit edin.

ANR raporlarını nasıl analiz ederim?​

Android Studio Profiler’de “Call Stack” sekmesini inceleyin, hangi yöntemlerin UI thread’de uzun süre çalıştığını görün. iOS Instruments’da “Time Profiler” ile benzer analizi yapabilirsiniz.

Yüksek çözünürlüklü görseller neden ANR’ye yol açar?​

Yüksek çözünürlüklü görseller, belleği hızla tüketir ve UI thread’de sık sık yeniden çizim yapılmasını gerektirir, bu da ANR riskini artırır.

Neden bazı sürümler ANR raporlamaz?​

İş parçacığı havuzları ve asenkron çözümler, UI thread’i boş tutarak ANR raporlamasını önler; ancak, gömülü blokajlar hâlâ raporlanabilir.

Sonuç​

“Uygulama yanıt vermiyor” hatası, sadece kullanıcı memnuniyetini azaltmakla kalmaz, aynı zamanda geliştiricilere uygulama performansının derinlemesine analizi için bir fırsat sunar. İş parçacığı yönetimi, bellek kontrolü, ağ isteklerinin zaman aşımı ve profil araçlarının etkin kullanımı, bu hatayı önlemenin anahtarıdır. Modern Android ve iOS geliştirme ekosistemleri, Coroutine, RxJava, OkHttp gibi güçlü kütüphanelerle bu sorunları çözmek için zengin araçlar sunar. Geliştiriciler, önerilen pratikleri uygulayarak, uygulamanın yanıt süresini optimize edebilir ve “uygulama yanıt vermiyor” ekranını kullanıcı deneyiminden uzak tutabilir.
 
Geri