इस दस्तावेज़ में, ANR स्टैक में काम न करने वाले थ्रेड की पहचान करने का तरीका बताया गया है डंप. काम नहीं करने वाला थ्रेड, ANR वाली गड़बड़ी के टाइप के हिसाब से अलग-अलग होता है, जैसा कि यहां दिखाया गया है टेबल.
ANR प्रकार | थ्रेड जिसका कोई जवाब नहीं मिला |
---|---|
इनपुट डिस्पैच | मुख्य थ्रेड |
इनपुट डिस्पैच कोई फ़ोकस विंडो नहीं है | मुख्य थ्रेड. आम तौर पर, ANR वाली इस तरह की गड़बड़ी, ब्लॉक किए गए ऐप्लिकेशन की वजह से नहीं होती थ्रेड. |
ब्रॉडकास्ट रिसीवर (सिंक्रोनस) | थ्रेड चल रहा है
onReceive() .
यह मुख्य थ्रेड तब तक है, जब तक कि गैर-मुख्य थ्रेड पर कस्टम हैंडलर न हो
इसका उपयोग करके तय
Context.registerReceiver . |
ब्रॉडकास्ट रिसीवर (एसिंक्रोनस) | कोड की जांच करके देखें कि कौनसा थ्रेड या थ्रेड पूल इसका इस्तेमाल करता है
के बाद प्रसारण संसाधित करने का काम
goAsync अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है
को कॉल किया जाता है. |
सेवा का टाइम आउट लागू किया जा रहा है | मुख्य थ्रेड |
फ़ोरग्राउंड सेवा शुरू | मुख्य थ्रेड |
कॉन्टेंट देने वाला जवाब नहीं दे रहा है | इनमें से कोई एक:
|
इस पर कोई जवाब नहीं
onStartJob अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है
या
onStopJob |
मुख्य थ्रेड |
कभी-कभी थ्रेड, किसी दूसरे थ्रेड में मूल वजह की वजह से काम नहीं करती या प्रोसेस करना होगा. नीचे दी गई चीज़ों पर इंतज़ार करने की वजह से शायद थ्रेड काम नहीं कर रही:
- लॉक किसी दूसरे थ्रेड के पास है.
- किसी दूसरी प्रोसेस के लिए धीमा बाइंडर कॉल.
काम न करने वाले थ्रेड की सामान्य वजहें
जवाब नहीं देने वाले थ्रेड की सामान्य वजहें नीचे दी गई हैं.
धीमा बाइंडर कॉल
वैसे तो ज़्यादातर बाइंडर कॉल तेज़ होते हैं, लेकिन लॉन्ग टेल की प्रक्रिया बहुत धीमी हो सकती है. यह है ऐसा तब ज़्यादा हो सकता है, जब डिवाइस लोड हो या बाइंडर जवाब थ्रेड हो धीमा हो सकता है, जैसे कि लॉक के विवाद, कई इनकमिंग बाइंडर कॉल या हार्डवेयर ऐब्स्ट्रक्शन लेयर (HAL) टाइम आउट.
इस समस्या को हल करने के लिए, सिंक्रोनस बाइंडर कॉल को बैकग्राउंड थ्रेड में ले जाएं हमारा सुझाव है. अगर कॉल मुख्य थ्रेड पर ही होना चाहिए, तो कॉल धीमा है. ऐसा करने का सबसे अच्छा तरीका परफ़ेटो ट्रेस का इस्तेमाल करना है.
स्टैक में BinderProxy.transactNative
या Binderproxy.transact
देखें.
इसका मतलब है कि बाइंडर कॉल हो रहा है. इन दो पंक्तियों के बाद, आप
बाइंडर एपीआई को कॉल किया जाता है. नीचे दिए गए उदाहरण में,
IAccessibilityManager.addClient
.
main tid=123
...
android.os.BinderProxy.transactNative (Native method)
android.os.BinderProxy.transact (BinderProxy.java:568)
android.view.accessibility.IAccessibilityManager$Stub$Proxy.addClient (IAccessibilityManager.java:599)
...
लगातार कई बाइंडर कॉल
अगर किसी टाइट लूप में लगातार कई बाइंडर कॉल किए जाते हैं, तो वह लंबे समय तक रोका जा सकता है.
ब्लॉक करने वाला I/O
मुख्य थ्रेड पर, I/O को कभी ब्लॉक न करें. यह एक एंटीपैटर्न है.
लॉक का विवाद
अगर लॉक हासिल करते समय, थ्रेड को ब्लॉक किया जाता है, तो ANR की गड़बड़ी हो सकती है.
यहां दिए गए उदाहरण में दिखाया गया है कि मुख्य थ्रेड को ब्लॉक किया गया है, ताकि लॉक:
main (tid=1) Blocked
Waiting for com.example.android.apps.foo.BarCache (0x07d657b7) held by
ptz-rcs-28-EDITOR_REMOTE_VIDEO_DOWNLOAD
[...]
at android.app.ActivityThread.handleStopActivity(ActivityThread.java:5412)
[...]
वीडियो डाउनलोड करने के लिए, ब्लॉक करने वाला थ्रेड एचटीटीपी अनुरोध कर रहा है:
ptz-rcs-28-EDITOR_REMOTE_VIDEO_DOWNLOAD (tid=110) Waiting
at jdk.internal.misc.Unsafe.park(Native method:0)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:211)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:715)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1047)
at java.util.concurrent.CountDownLatch.await(CountDownLatch.java:230)
at com.example.android.apps.foo.HttpRequest.execute(HttpRequest:136)
at com.example.android.apps.foo$Task$VideoLoadTask.downloadVideoToFile(RequestExecutor:711)
[...]
महंगा फ़्रेम
एक फ़्रेम में बहुत ज़्यादा चीज़ें रेंडर करने से मुख्य थ्रेड बन सकता है फ़्रेम की अवधि के लिए प्रतिक्रिया नहीं देता है, जैसे कि:
- कई ग़ैर-ज़रूरी ऑफ़-स्क्रीन आइटम रेंडर हो रहे हैं.
- कई यूज़र इंटरफ़ेस (यूआई) को रेंडर करते समय, खराब एल्गोरिदम का इस्तेमाल करना. जैसे,
O(n^2)
एलिमेंट.
दूसरे कॉम्पोनेंट ने ब्लॉक किया है
अगर ब्रॉडकास्ट रिसीवर जैसा कोई अन्य कॉम्पोनेंट, मुख्य थ्रेड को ब्लॉक करता है पांच सेकंड से ज़्यादा होने पर, इससे इनपुट डिसपैच ANR और गंभीर जैंक होने का खतरा हो सकता है.
ऐप्लिकेशन के कॉम्पोनेंट में, मुख्य थ्रेड पर कोई भी काम करने से बचें. ब्रॉडकास्ट चलाएं ईमेल पाने वालों को अलग-अलग थ्रेड पर भेजना होगा.