Sparround

Main thread, ANR, proses və thread-lər

Hər tətbiq defolt olaraq bir prosesdə, UI isə tək main (UI) thread-də işləyir. İki dəmir qayda:

  • Main thread-i bloklama — UI donur.
  • UI-a yalnız main thread-dən toxun — əks halda exception.

ANR (Application Not Responding) — sistem dialoqu, yaranma səbəbləri:

  • Input event 5 saniyə ərzində emal olunmur
  • BroadcastReceiver ~10 saniyəyə bitmir
  • Foreground service startForeground-u vaxtında çağırmır

Tipik günahkarlar: main thread-də şəbəkə/disk əməliyyatı, sinxron IPC, ağır JSON parsing, SharedPreferences commit(), lock gözləmələri.

Müasir həll: coroutines + dispatchers (IO/Default-a keçir, nəticəni Main-də göstər). Köhnə üsullar (AsyncTask — deprecated, HandlerThread, ExecutorService) haqqında soruşula bilər — AsyncTask-ın niyə deprecated olduğunu bil: lifecycle-dan xəbərsizdir, leak yaradır, error handling zəifdir.

kotlin
// PİS: main thread-də disk + şəbəkə
override fun onCreate(savedInstanceState: Bundle?) {
    val cached = File(filesDir, "rates.json").readText()      // disk!
    val rates = fetchRatesSync()                                // şəbəkə!!
}

// YAXŞI: iş IO-da, nəticə Main-də
lifecycleScope.launch {
    val rates = withContext(Dispatchers.IO) {
        val cached = File(filesDir, "rates.json").readText()
        parseOrFetch(cached)
    }
    binding.ratesView.render(rates)   // main thread
}

ANR-a aparan kod və düzəldilmiş variantı

Diaqnostika sualına hazır ol: "Production-da ANR artıb — nə edərsən?" Cavab axını: Play Console ANR rate və stack trace-ləri → hansi thread nəyi gözləyir (main thread-in stack-i) → StrictMode ilə lokal reproduksiya → düzəliş (işi background-a köçür) → release-dən sonra metrikanın enməsini izlə. Android vitals-da ANR həddi aşılanda Play Store görünürlüğü də cəzalanır — bunu bilmək praktiki təcrübə siqnalıdır.

🛠 Tapşırıq

ANR-ı öz gözünlə gör: onCreate-də Thread.sleep(8000) qoy və tətbiqə toxun — sistem dialoqunu gözlə.

  • Sonra Application-da StrictMode-u aktivləşdir (penaltyLog) və main thread-də bir fayl oxu — logcat-da pozuntunu tap.
  • Həmin işi withContext(Dispatchers.IO)-ya köçür, pozuntunun yox olduğunu təsdiqlə.

Bitdi sayılır: "production-da ANR artıb" sualına diaqnostika addımlarını sadalaya bilirsənsə.

📚 Mənbələr və sənədlər