Bu dokümanda, Android sisteminin bir uygulamanın yanıt verip vermediğini nasıl belirlediği ve uygulamanızı nasıl duyarlı tutacağı gösterilmektedir.
Kodunuz ne kadar iyi yazılmış olursa olsun uygulamanız yavaşlayabilir, takılabilir, uzun süre donabilir veya girişi işlemesi uzun sürebilir. Uygulamanız ön plandaysa ve yanıt vermiyorsa kullanıcı, Şekil 1'de gösterildiği gibi Yanıt Vermiyor (ANR) iletişim kutusunu görür. ANR iletişim kutusu, kullanıcının uygulamayı çıkmaya zorlamasına olanak tanır. Uygulama ön planda değilse sessizce durdurulur. ANR iletişim kutularını en aza indirmek için uygulamanızın duyarlılığını tasarlamak çok önemlidir.
ANR tetikleyicileri
Genel olarak bir uygulama, ana iş parçacığındaki (UI iş parçacığı olarak da bilinir) kullanıcı girişine yanıt veremediğinde sistem bir ANR gösterir. Bu durum, sistemin gelen kullanıcı girişi etkinliklerini işlemesini engeller.
Örneğin, bir uygulama, kullanıcı arayüzü iş parçacığında ağ erişimi gibi engelleyici bir G/Ç işlemi gerçekleştirirse ANR meydana gelebilir. Başka bir örnek de bir uygulamanın ayrıntılı bir bellek içi yapı oluşturmak veya oyundaki bir sonraki hamleyi kullanıcı arayüzü iş parçacığında hesaplamak için çok fazla zaman harcamasıdır.
Android'de uygulama duyarlılığı ActivityManager
ve WindowManager
sistem hizmetleri tarafından izlenir. Android, aşağıdaki koşullardan birini algıladığında uygulama için ANR iletişim kutusunu görüntüler:
- Tuşa basma veya ekrana dokunma etkinlikleri gibi giriş etkinliklerine 5 saniye içinde yanıt verilmemelidir.
BroadcastReceiver
, ön plan amaçları için yürütme 10 ila 20 saniye içinde tamamlanmaz. Daha fazla bilgi edinmek için Yayın alıcısı zaman aşımı konusuna bakın.
ANR'lerden kaçınma
Aşağıda ANR'lerden kaçınmaya yönelik genel ipuçları verilmiştir. Farklı ANR türlerini teşhis etme ve hata ayıklama hakkında daha fazla bilgi için bu bölümdeki diğer sayfalara bakın.
Ana iş parçacığının engelini her zaman açık tutun ve ileti dizilerini stratejik olarak kullanın.
Uygulamanın ana iş parçacığında engelleme veya uzun süreli işlemler gerçekleştirmeyin. Bunun yerine, bir çalışan iş parçacığı oluşturun ve işin çoğunu burada yapın.
Ana iş parçacığı ile diğer iş parçacıkları arasındaki kilit anlaşmazlığını en aza indirmeye çalışın.
Ana iş parçacığında, yayınları işleme veya hizmetleri çalıştırma gibi kullanıcı arayüzüyle ilgili olmayan tüm işlemleri en aza indirin. Kullanıcı arayüzü iş parçacığında çalışan herhangi bir yöntem, söz konusu iş parçacığında mümkün olduğunca az çalışma yapmalıdır. Özellikle
onCreate()
veonResume()
gibi temel yaşam döngüsü yöntemlerini ayarlamak için aktivitelerin mümkün olduğunca az çalışması gerekir. Bir arka plan iş parçacığı üzerinde çalışmayı planlama ve kullanıcı arayüzüyle iletişim kurma konusunda mevcut çözümler hakkında daha fazla bilgi edinmek için Arka planda çalışmaya genel bakış bölümüne bakın.İş parçacığı havuzlarını bileşenler arasında paylaşırken dikkatli olun. Aynı iş parçacıklarını, uzun engelleyebilecek işlemler ve yayın alma gibi zaman açısından hassas görevler için kullanmayın.
Uygulama hızlı başlatılır. Uygulamanın başlangıç kodunda, hançerin ilk kullanıma hazırlanması sırasında çalıştırılan yöntemler gibi yavaş veya engelleyici işlemleri en aza indirin.
BroadcastReceiver
kullanıyorsanız yayın alıcılarınıContext.registerReceiver
kullanarak ana olmayan bir iş parçacığında çalıştırmayı düşünebilirsiniz. Daha fazla bilgi için BroadcastReceiver'da ANR'ler başlıklı makaleyi inceleyin.goAsync()
kullanıyorsanızPendingResult.finish
'in ANR zaman aşımından hemen önce çağrıldığından emin olun.
BroadcastReceiver'da ANR'ler
Yayın alıcıları arka planda bir ayarı kaydetme veya Notification
kaydettirme gibi küçük miktarlarda iş yapmak üzere olduğundan BroadcastReceiver
yürütme süresi kısıtlıdır. Bu nedenle, kullanıcı arayüzü iş parçacığında çağrılan diğer yöntemlerde olduğu gibi, uygulamalar bir yayın alıcısında uzun süreli olabilecek işlemlerden veya hesaplamalardan kaçınmalıdır. Kullanıcı arayüzü iş parçacığı aracılığıyla uzun süreli görevleri gerçekleştirmek yerine, bu görevleri daha sonra yürütmek üzere arka planda gerçekleştirin. Olası çözümler hakkında daha fazla bilgi için Arka planda çalışmaya genel bakış bölümüne bakın.
BroadcastReceiver
nesneleriyle ilgili diğer bir yaygın sorun, nesneleri çok sık çalıştıklarında ortaya çıkar. Arka planda sık yürütme işlemi, diğer uygulamaların kullanabileceği bellek miktarını azaltabilir. BroadcastReceiver
nesnelerini etkili bir şekilde etkinleştirme ve devre dışı bırakma hakkında daha fazla bilgi için Yayınlara genel bakış konusuna bakın.
Duyarlılığı güçlendirin
Genellikle 100-200 ms., kullanıcıların bir uygulamadaki yavaşlığı algıladığı eşiktir. Aşağıda, uygulamanızın kullanıcılara duyarlı görünmesini sağlayacak ek ipuçları verilmiştir:
Uygulamanız kullanıcı girişine yanıt olarak arka planda çalışıyorsa ilerlemenin devam ettiğini gösterin (örneğin, kullanıcı arayüzünüze
ProgressBar
ile).Özellikle oyunlarda, çalışan iş parçacığındaki hareket hesaplamaları yapın.
Uygulamanızın ilk kurulum aşaması çok zaman alıyorsa bir başlangıç ekranı göstermeyi veya ana görünümü mümkün olduğunca hızlı oluşturmayı düşünün. Yüklemenin devam ettiğini belirtin ve bilgileri eşzamansız olarak doldurun. Her iki durumda da, kullanıcının uygulamanın donduğunu algılamaması için bir şekilde ilerleme kaydedildiğini belirtmenizi öneririz.
Uygulamanızın yanıt verme hızındaki performans sorunlarını belirlemek için Perfetto ve CPU Profiler gibi performans araçlarını kullanın.