पहली इमेज. उपयोगकर्ता को दिखने वाला, एएनआर का डायलॉग.
इस दस्तावेज़ में बताया गया है कि Android सिस्टम, यह कैसे तय करता है कि कोई ऐप्लिकेशन काम नहीं कर रहा है. इसमें यह भी बताया गया है कि अपने ऐप्लिकेशन को रिस्पॉन्सिव कैसे रखा जाए.
आपका कोड कितना भी अच्छी तरह से लिखा गया हो, यह मुमकिन है कि आपका ऐप्लिकेशन अब भी धीमा चले, हैंग हो जाए, लंबे समय तक फ़्रीज़ हो जाए या इनपुट प्रोसेस करने में ज़्यादा समय ले. अगर आपका ऐप्लिकेशन फ़ोरग्राउंड में है और वह रिस्पॉन्स नहीं दे रहा है, तो उपयोगकर्ता को 'ऐप्लिकेशन काम नहीं कर रहा है' (एएनआर) का डायलॉग दिखता है. जैसा कि पहली इमेज में दिखाया गया है. एएनआर के डायलॉग से, उपयोगकर्ता ऐप्लिकेशन को फ़ोर्स क्विट कर सकता है. अगर ऐप्लिकेशन फ़ोरग्राउंड में नहीं है, तो वह चुपचाप बंद हो जाता है. एएनआर के डायलॉग को कम से कम दिखाने के लिए, अपने ऐप्लिकेशन को रिस्पॉन्सिव बनाना ज़रूरी है.
एएनआर ट्रिगर
आम तौर पर, सिस्टम एएनआर तब दिखाता है, जब कोई ऐप्लिकेशन मुख्य थ्रेड—जिसे यूज़र इंटरफ़ेस (यूआई) थ्रेड भी कहा जाता है—पर उपयोगकर्ता के इनपुट का जवाब नहीं दे पाता. इससे सिस्टम, उपयोगकर्ता के इनपुट इवेंट को प्रोसेस नहीं कर पाता.
उदाहरण के लिए, एएनआर तब हो सकता है, जब कोई ऐप्लिकेशन यूज़र इंटरफ़ेस (यूआई) थ्रेड पर, नेटवर्क ऐक्सेस जैसे ब्लॉक करने वाले इनपुट/आउटपुट (आई/ओ) ऑपरेशन करता है. एक और उदाहरण तब है, जब कोई ऐप्लिकेशन यूज़र इंटरफ़ेस (यूआई) थ्रेड पर, इन-मेमोरी स्ट्रक्चर बनाने या गेम में अगली चाल की गणना करने में ज़्यादा समय लेता है.
Android में, ऐप्लिकेशन की रिस्पॉन्सिवनेस को ActivityManager और
WindowManager सिस्टम सेवाओं से मॉनिटर किया जाता है. Android, किसी ऐप्लिकेशन के लिए एएनआर का डायलॉग तब दिखाता है, जब उसे इनमें से कोई एक स्थिति दिखती है:
- पांच सेकंड के अंदर, किसी इनपुट इवेंट—जैसे कि बटन दबाने या स्क्रीन पर टैप करने वाले इवेंट—का कोई जवाब न मिलना.
- फ़ोरग्राउंड इंटेंट के लिए, A
BroadcastReceiverको 10 से 20 सेकंड के अंदर पूरा न करना. ज़्यादा जानकारी के लिए, ब्रॉडकास्ट रिसीवर का टाइम आउट होना लेख पढ़ें.
एएनआर से बचना
एएनआर से बचने के लिए, यहां कुछ सामान्य सलाह दी गई हैं. अलग-अलग तरह के एएनआर की पहचान करने और उन्हें डीबग करने के बारे में ज़्यादा जानने के लिए, इस सेक्शन के अन्य पेज देखें.
मुख्य थ्रेड को हमेशा अनब्लॉक रखें और थ्रेड का इस्तेमाल रणनीति के तहत करें.
ऐप्लिकेशन के मुख्य थ्रेड पर, ब्लॉक करने वाले या लंबे समय तक चलने वाले ऑपरेशन न करें. इसके बजाय, काम को बैकग्राउंड डिस्पैचर (जैसे,
Dispatchers.IOयाDispatchers.Default) पर ऑफ़लोड करने के लिए, Kotlin कोरोटीन का इस्तेमाल करें. इन बैकग्राउंड टास्क को सुरक्षित तरीके से लॉन्च करने के लिए,viewModelScopeजैसे मैकेनिज़्म का इस्तेमाल करें. साथ ही, Compose की स्थिति में होने वाले बदलावों के जवाब में इन्हें ट्रिगर करने के लिए,LaunchedEffectका इस्तेमाल करें.मुख्य थ्रेड और अन्य थ्रेड के बीच, लॉक कॉन्टेंशन को कम से कम करने की कोशिश करें.
मुख्य थ्रेड पर, यूज़र इंटरफ़ेस (यूआई) से जुड़े काम को कम से कम करें. जैसे, ब्रॉडकास्ट को हैंडल करना या सेवाओं को चलाना. यूज़र इंटरफ़ेस (यूआई) थ्रेड में चलने वाले किसी भी तरीके या फ़ंक्शन को कम से कम काम करना चाहिए. खास तौर पर, ऐक्टिविटी को लाइफ़साइकल के मुख्य तरीकों में सेट अप करने के लिए, कम से कम काम करना चाहिए. जैसे,
onCreateऔरonResume. कभी भी कंपोज़ेबल फ़ंक्शन के अंदर, सीधे तौर पर इनपुट/आउटपुट (आई/ओ) या भारी, ब्लॉक करने वाली कैलकुलेशन न करें. इससे कंपोज़िशन और रीकंपोज़िशन के दौरान, यूज़र इंटरफ़ेस (यूआई) थ्रेड ब्लॉक हो जाता है. बैकग्राउंड थ्रेड पर काम शेड्यूल करने और यूज़र इंटरफ़ेस (यूआई) के साथ वापस कम्यूनिकेट करने के लिए उपलब्ध समाधानों के बारे में ज़्यादा जानने के लिए, बैकग्राउंड टास्क की खास जानकारी देखें.कॉम्पोनेंट के बीच थ्रेड पूल शेयर करते समय सावधानी बरतें. संभावित तौर पर लंबे समय तक ब्लॉक करने वाले ऑपरेशन और समय के हिसाब से ज़रूरी टास्क के लिए, एक ही थ्रेड का इस्तेमाल न करें. जैसे, ब्रॉडकास्ट रिसीव करना.
ऐप्लिकेशन को तेज़ी से शुरू करें. ऐप्लिकेशन के स्टार्टअप कोड में, धीमी या ब्लॉक करने वाली कार्रवाइयों को कम से कम करें. जैसे, डिपेंडेंसी इंजेक्शन सेटअप के दौरान चलने वाले तरीके (जैसे, Hilt के साथ) या Jetpack App Startup लाइब्रेरी का इस्तेमाल करके शुरू किए गए कॉम्पोनेंट. बेसलाइन प्रोफ़ाइल, स्टार्टअप प्रोफ़ाइल, और R8 का इस्तेमाल करके, ऐप्लिकेशन के स्टार्टअप को और ऑप्टिमाइज़ किया जा सकता है.
अगर
BroadcastReceiverका इस्तेमाल किया जा रहा है, तो ब्रॉडकास्ट रिसीवर को मुख्य थ्रेड के अलावा किसी अन्य थ्रेड में चलाने पर विचार करें.Context.registerReceiverज़्यादा जानकारी के लिए, BroadcastReceiver में एएनआर की गड़बड़ियां लेख पढ़ें.- अगर
goAsyncका इस्तेमाल किया जाता है, तो पक्का करें कि एएनआर के टाइम आउट से पहले,PendingResult.finishको तुरंत कॉल किया जाए.
- अगर
BroadcastReceiver में एएनआर की गड़बड़ियां
BroadcastReceiver के एक्ज़ीक्यूशन का समय सीमित होता है, क्योंकि ब्रॉडकास्ट रिसीवर
को बैकग्राउंड में कम और अलग-अलग काम करने के लिए बनाया जाता है. जैसे, सेटिंग सेव करना या Notification रजिस्टर करना. इसलिए, यूज़र इंटरफ़ेस (यूआई) थ्रेड में कॉल किए गए अन्य तरीकों की तरह ही, ऐप्लिकेशन को ब्रॉडकास्ट रिसीवर में, संभावित तौर पर लंबे समय तक चलने वाले ऑपरेशन या कैलकुलेशन से बचना चाहिए. यूज़र इंटरफ़ेस (यूआई) थ्रेड के ज़रिए, लंबे समय तक चलने वाले टास्क करने के बजाय, उन्हें बाद में एक्ज़ीक्यूट करने के लिए बैकग्राउंड में करें. संभावित समाधानों के बारे में ज़्यादा जानने के लिए, बैकग्राउंड टास्क की खास जानकारी देखें.
BroadcastReceiver ऑब्जेक्ट के साथ एक और आम समस्या तब होती है, जब वे बहुत ज़्यादा बार एक्ज़ीक्यूट होते हैं. बैकग्राउंड में बार-बार एक्ज़ीक्यूट होने से, अन्य ऐप्लिकेशन के लिए उपलब्ध मेमोरी कम हो सकती है. ऑब्जेक्ट को असरदार तरीके से चालू और बंद करने
BroadcastReceiver के तरीके के बारे में ज़्यादा जानने के लिए, ब्रॉडकास्ट की खास जानकारी देखें.
रिस्पॉन्सिवनेस को बेहतर बनाना
आम तौर पर, 100 से 200 मिलीसेकंड वह थ्रेशोल्ड है जिसके बाद उपयोगकर्ताओं को किसी ऐप्लिकेशन में धीमापन महसूस होता है. अपने ऐप्लिकेशन को उपयोगकर्ताओं के लिए रिस्पॉन्सिव बनाने के लिए, यहां कुछ और सलाह दी गई हैं:
अगर आपका ऐप्लिकेशन, उपयोगकर्ता के इनपुट के जवाब में बैकग्राउंड में काम कर रहा है, तो दिखाएं कि प्रोग्रेस हो रही है. जैसे, अपने यूज़र इंटरफ़ेस (यूआई) में
CircularProgressIndicatorयाLinearProgressIndicatorदिखाएं.खास तौर पर गेम के लिए, बैकग्राउंड कोरोटीन या वर्कर थ्रेड में चालों के लिए कैलकुलेशन करें.
अगर आपके ऐप्लिकेशन को शुरू करने में ज़्यादा समय लगता है, तो स्प्लैश स्क्रीन दिखाने या शुरुआती कंपोज़िशन को जल्द से जल्द रेंडर करने पर विचार करें. बताएं कि लोड हो रहा है और यूज़र इंटरफ़ेस (यूआई) की स्थिति को एसिंक्रोनस तरीके से भरें. हमारा सुझाव है कि किसी भी मामले में, यह दिखाया जाए कि प्रोग्रेस हो रही है, ताकि उपयोगकर्ता को यह न लगे कि ऐप्लिकेशन फ़्रीज़ हो गया है.
अपने ऐप्लिकेशन की रिस्पॉन्सिवनेस में बॉटलनेक का पता लगाने के लिए, Perfetto और CPU Profiler जैसे परफ़ॉर्मेंस टूल का इस्तेमाल करें.