दिलचस्प पोस्ट
पाठ के मध्य में अंडाकार (मैक शैली) जावा में स्विंग का उपयोग करके जीयूआई विकास में सही ढंग से एमवीसी पैटर्न को लागू करना मैं कैसे बता सकता हूं कि पुस्तकालय को -जी के साथ संकलित किया गया था? Django ModelForm में सहेजें विधि को ओवरराइड कर रहा है ग्राहकों से आईफोन क्रैश लॉग कैसे प्राप्त करें? सर्वश्रेष्ठ फ़िट शेड्यूलिंग एल्गोरिथम VB.net JSON Deserialize addEventListener IE8 में काम नहीं कर रहा है फ़ंक्शन कॉल पर टाइमआउट कमांड लाइन तर्क की अधिकतम लंबाई जिसे SQL * प्लस (लिनक्स सी शेल से) में पारित किया जा सकता है? Android में गतिशील रूप से एक बटन कैसे जोड़ें? ListView.ScrollIntoView सूची सूची के केंद्र में आइटम स्क्रॉल करें (सी #) 3 डी रेखा-विमान का चौराह ईक्लिपस पर सी + + 11 पूर्ण समर्थन के लिए इकाई फ़्रेमवर्क में नेविगेशन गुण क्या हैं?

लकड़हारा में कोरियोग्राफर संदेश का अर्थ

मैंने SDK (API 16) के नवीनतम संस्करण स्थापित किए और नवीनतम एडीटी मिला। अब मैं इन संदेशों को लॉककैट में देख रहा हूं, मुझे पूरा यकीन है, मैंने पहले नहीं देखा है क्या किसी के पास इस बारे में कोई विचार है?

06-29 23: 11: 17.796: मैं / कोरियोग्राफर (691): 647 फ्रेम छोड़े गए! आवेदन मुख्य धागे पर बहुत ज्यादा काम कर रहा हो सकता है

मैंने एक खोज की और यह लिंक पाया: http://developer.android.com/reference/android/view/Choreographer.html । यह एपीआई 16 में पेश किया गया एक नया वर्ग है

मुझे यह जानना होगा कि मैं कैसे यह निर्धारित कर सकता हूं कि "बहुत ज्यादा काम" मेरा आवेदन क्या कर रहा है क्योंकि मेरी सभी प्रोसेसिंग AsyncTask एस में की जाती है।

वेब के समाधान से एकत्रित समाधान "लकड़हारा में कोरियोग्राफर संदेश का अर्थ"

कोरियोग्राफर, एप्स को अपने प्रदर्शन को बेहतर बनाने के लिए विसंस्क को कनेक्ट करने और सही समय पर काम करने देता है।

एंड्रॉइड व्यू एनीमेशन आंतरिक रूप से एक ही उद्देश्य के लिए कोरियोग्राफर का उपयोग करता है: एनीमेशन को ठीक से समय और संभवत: प्रदर्शन को सुधारने के लिए

चूंकि कोरियोग्राफर को हर विन्डिनक घटनाओं के बारे में बताया जाता है, इसलिए मैं बता सकता हूं कि कोरियोग्राफर.post * एपीआईएस द्वारा पारित किए जाने वाले रननेबल में से एक एक फ्रेम के समय में खत्म नहीं होता है, जिससे फ़्रेम को छोड़ दिया जा सकता है।

मेरी समझ में कोरियोग्राफर केवल लंघन फ्रेम का पता लगा सकता है। यह कहने का कोई तरीका नहीं है कि ऐसा क्यों होता है।

संदेश "आवेदन मुख्य धागे पर बहुत अधिक काम कर रहा हो सकता है।" भ्रामक हो सकता है

मैं पार्टी में देर कर रहा हूं, लेकिन उम्मीद है कि यह अन्य उत्तरों के लिए एक उपयोगी अतिरिक्त है …

प्रश्न का उत्तर देना / टीएल: डॉ;

मुझे यह जानना होगा कि मैं कैसे यह निर्धारित कर सकता हूं कि "बहुत ज्यादा काम" मेरा आवेदन क्या कर रहा है क्योंकि मेरी सभी प्रसंस्करण असिनक टास्क में है

निम्नलिखित सभी उम्मीदवार हैं:

  • आईओ या मुख्य थैली पर महंगी प्रसंस्करण (लोड करने वाले डोज़ेबल, लेआउट बढ़ाना, और Uri पर सेट करें, ImageView पर सभी मुख्य थ्रेड पर IO का निर्माण करते हैं)
  • बड़े / जटिल / गहरा View पदानुक्रम प्रतिपादन
  • एक View पदानुक्रम के बड़े हिस्से को अमान्य किया जा रहा है
  • कस्टम View में महंगे onDraw विधियां
  • एनिमेशन में महंगी गणना
  • "पृष्ठभूमि" ( AsyncTask की "पृष्ठभूमि" डिफ़ॉल्ट रूप से "पृष्ठभूमि", java.lang.Thread नहीं है ) को "उच्च" प्राथमिकता को चलाने के लिए "कार्यकर्ता" थ्रेड्स चला रहा है
  • कचरा पैदा करने के लिए कचरा कलेक्टर के कारण, "दुनिया को रोक" करने के लिए – मुख्य थ्रेड सहित – जब यह साफ हो जाता है

वास्तव में विशिष्ट कारण निर्धारित करने के लिए आपको अपने ऐप को प्रोफाइल करने की आवश्यकता होगी

ज्यादा जानकारी

मैं कोरियरोग्राफर को प्रयोग करके और कोड को देखकर समझने की कोशिश कर रहा था।

कोरियोग्राफर के दस्तावेज़ीकरण "एनिमेशन, इनपुट और ड्राइंग के समय को निर्देशित करता है।" जो वास्तव में एक अच्छा वर्णन है, लेकिन बाकी एनिमेशन पर जोर देते हैं

कोरियोग्राफर वास्तव में 3 प्रकार के कॉलबैक निष्पादित करने के लिए ज़िम्मेदार हैं, जो इस क्रम में चलते हैं:

  1. इनपुट-हैंडलिंग कॉलबैक (उपयोगकर्ता-इनपुट जैसे स्पर्श इवेंट)
  2. फ़्रेम के बीच टिइनिंग के लिए एनीमेशन कॉलबैक, चलने वाले किसी भी / सभी एनिमेशन के लिए एक स्थिर फ्रेम-प्रारंभ-समय की आपूर्ति करना इन कॉलबैक चलाना 2 मतलब किसी एनीमेशन से संबंधित गणना (उदाहरण के दृश्य का बदलते पद) पहले से ही तीसरे प्रकार के कॉलबैक को लागू किया गया है …
  3. दृश्य पदानुक्रम को आकर्षित करने के लिए ट्रैवर्सल कॉलबैक देखें

इसका उद्देश्य, जिस दर पर अमान्य दृश्यों को फिर से तैयार किया गया है (और एनीमेशन टिवीन किया गया है) स्क्रीन विन्डिक के साथ – आमतौर पर 60 एफपीएस है।

छोड़ दिए गए फ़्रेमों के बारे में चेतावनी एक पश्चाताप की तरह दिखती है: 3 चरणों के माध्यम से एक सिंगल पास 30x से अधिक अपेक्षित फ्रेम अवधि लेता है, इसलिए लॉग संदेश में देखने की सबसे छोटी संख्या " 30 फ्रेम छोड़ दी गई" ; यदि प्रत्येक पास से 50% अधिक समय लगता है तो क्या आप अभी भी 30 फ्रेम ( शरारती! ) को छोड़ देंगे लेकिन आपको इसके बारे में चेतावनी नहीं दी जाएगी।

3 चरणों में से यह स्पष्ट था कि यह केवल ऐनिमेशन ही नहीं है जो चेतावनी को ट्रिगर कर सकते हैं: एक विशाल View पदानुक्रम या जटिल View साथ एक View एक महत्वपूर्ण भाग को अमान्य कर रहा है पर्याप्त हो सकता है

उदाहरण के लिए यह बार-बार चेतावनी को ट्रिगर करेगा:

 public class AnnoyTheChoreographerActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.simple_linear_layout); ViewGroup root = (ViewGroup) findViewById(R.id.root); root.addView(new TextView(this){ @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); long sleep = (long)(Math.random() * 1000L); setText("" + sleep); try { Thread.sleep(sleep); } catch (Exception exc) {} } }); } } 

… जो इस तरह लॉगिंग पैदा करता है:

 11-06 09:35:15.865 13721-13721/example I/Choreographer﹕ Skipped 42 frames! The application may be doing too much work on its main thread. 11-06 09:35:17.395 13721-13721/example I/Choreographer﹕ Skipped 59 frames! The application may be doing too much work on its main thread. 11-06 09:35:18.030 13721-13721/example I/Choreographer﹕ Skipped 37 frames! The application may be doing too much work on its main thread. 

आप onDraw दौरान स्टैक से देख सकते हैं कि कोरियोग्राफर इसमें शामिल है चाहे आप एनिमेटिंग हो रहे हों या नहीं:

उदाहरण के तौर पर। अभिमानीचित्रलेखक गतिविधि $ 1। डॉन (नाराजडियोग्राफर गतिविधि.जावा) और android.view.View.draw पर (देखें.जावा 13,75 9)

… पुनरावृत्ति का एक सा …

android.view.ViewGroup.drawChild पर (ViewGroup.java3169) android.view.ViewGroup.dispatchDraw पर (ViewGroup.java.3039) android.view.View.draw पर (देखें.जावा 13,762) android.widget पर। Com.android.internal.policy.impl.PhoneWindow $ DecorView.draw (PhoneWindow.java) पर एंड्रॉइड। View.View.getDisplayList (देखें.जावा 12710) पर FrameLayout.draw (FrameLayout.java:467) एंड्रॉइड एंड्रॉइड। view.View.getDisplayList (देखें.जावा 12754) android.view.HardwareRenderer $ GlRenderer.draw पर (HardwareRenderer.java.1144) एंड्रॉइड। view.ViewRootImpl.draw (ViewRootImpl.java.2773) एंड्रॉइड पर। Android.view.ViewRootImpl.performTraversals पर ViewRootImpl.performDraw (ViewRootImpl.java:2145) android.view.ViewRootImpl.doTraversal पर (ViewRootImpl.java:1112) एंड्रॉइड। View.ViewRootImpl $ traversalRunnable.run पर (ViewRootImpl.java:4472) android.view.Choreographer $ CallbackRecord.run (कोरियोग्राफर.जावा: 725) एंड्रॉइड। View.Choreographer.do कॉलबैक (कोरियोग्राफर। जावा प्रिंट 55) एंड्रॉइड। View.Choreographer.doFrame (Cho android.view.ru पर। कोरियरोग्राफर $ फ़्रेम डिसप्लेइवेंट रीसेवर.रुन (कोरियोग्राफर.जावा: 711) एंड्रॉइड.ओएस.हैंडलर एचएंडले कॉलबैक (हैंडलर.जावाः 615) एंड्रॉइड.ओएस.हाण्डलर डिस्पेचमेल (हैंडलर.जावा) : 92) android.os.Looper.loop पर (Looper.java:137) android.app.ActivityThread.main (ActivityThread.java:4898) पर

अंत में, यदि अन्य थ्रेड्स से कोई विवाद होता है जो मुख्य थ्रेड को कम करने के काम की मात्रा को कम करता है, तो फ़ैसला छोड़ने का मौका नाटकीय ढंग से बढ़ता है, भले ही आप वास्तव में मुख्य थ्रेड पर काम नहीं कर रहे हों।

इस स्थिति में यह सुझाव देने के लिए भ्रामक माना जा सकता है कि ऐप मुख्य थ्रेड पर बहुत कुछ कर रहा है, लेकिन एंड्रॉइड वास्तव में कम प्राथमिकता में कार्यकर्ता थ्रेड्स को चलाने के लिए चाहता है ताकि मुख्य थ्रेड को भूख से रोका जा सके। यदि आपका कार्यकर्ता धागे कम प्राथमिकता है, तो कोरियोग्राफर चेतावनी को ट्रिगर करने का एकमात्र तरीका मुख्य थ्रेड पर बहुत अधिक करना है।

यह एक जानकारी संदेश है जो कई स्थितियों पर आपके लॉगकैट में पॉप कर सकता है।

मेरे मामले में, यह तब हुआ जब मैं एक्सएमएल लेआउट फाइलों से कई दृश्यों को प्रोग्रामेटिक रूप से बढ़ा रहा था। संदेश स्वयं के द्वारा हानिरहित होता है, लेकिन बाद में एक समस्या का संकेत हो सकता है जो आपके ऐप को इस्तेमाल करने के लिए अनुमति दी गई सभी रैम का उपयोग करेगी और मेगा-बेस्ट फ़ोर्स को बंद होने के कारण होगा। मुझे विकासकर्ता की तरह विकसित किया गया है जो उसे अपना लॉग वॉर्न / इन्फ़ो / एरर फ्री देखने को मिलता है। 😉

तो, यह मेरा अपना अनुभव है:

मुझे संदेश मिल गया:

 10-09 01:25:08.373: I/Choreographer(11134): Skipped XXX frames! The application may be doing too much work on its main thread. 

… जब मैं एक्सएमएल से एक दृश्य को बढ़ाकर अपना खुद का कस्टम "सुपर-कॉम्प्लेक्स मल्टी-सेक्शन लिस्ट" बना रहा था और अपने खेतों (छवियां, पाठ, आदि …) को एक बाकी की प्रतिक्रिया से आने वाले डेटा के साथ पॉपुलिंग कर रहा था / JSON वेब सेवा (पेजिंग क्षमताओं के बिना) यह विचार पंक्तियों, उप-अनुभाग शीर्षकों और अनुभाग शीर्षकों के रूप में एक पंक्तिबद्ध लयआउट (ScrollView के अंदर ऊर्ध्वाधर अभिविन्यास के साथ) को सही क्रम में उन सभी को जोड़कर कार्य करेगा। क्लिक करने योग्य तत्वों के साथ एक सूची दृश्य अनुकरण करने के लिए … लेकिन अच्छी तरह से, यह एक और सवाल के लिए है।

एक जिम्मेदार डेवलपर के रूप में आप ऐप वास्तव में सिस्टम संसाधनों के साथ कुशल बनाना चाहते हैं, इसलिए सूचियों के लिए सबसे अच्छा अभ्यास (जब आपकी सूचियां बहुत जटिल नहीं होती हैं) एक लोडर के साथ एक ListActivity या ListFragment का उपयोग करना है और एक एडाप्टर के साथ ListView को भरना है, यह अनुमान के मुताबिक अधिक कुशल है, वास्तव में यह है और आपको इसे हर समय करना चाहिए, फिर … अगर आपकी सूची इतनी जटिल नहीं है

समाधान: मैंने "बड़ी प्रतिक्रिया आकारों" को रोकने के लिए अपनी REST / JSON वेब सेवा पर पेजिंग कार्यान्वित किया था और मैंने कोड को लपेट कर "पंक्तियों", "अनुभाग शीर्षलेख" और "सब-सेशन हेडर" को एक असिनक टास्क पर मेन थ्रेड शांत

इसलिए … मुझे आशा है कि मेरा अनुभव इस जानकारी के संदेश के साथ अपने सिर को खिसकाने वाले किसी और को मदद करता है।

हैकिंग हैप्पी!

यह आम तौर पर तब होता है जब एमुलेटर का उपयोग करके डीबग करना, जो कि किसी भी तरह धीमा हो जाता है।

मेरे मामले में मेरे पास ये संदेश होते हैं जब मैं दिखाता हूँ कि शेललॉक ऐक्शन बार में प्रगति बार घुसाया जाता है। चूंकि इसकी मेरी लाइब्रेरी नहीं है, इसलिए मैंने कोरियोग्राफर आउटपुट को छिपाने का फैसला किया।

आप इस फिल्टर अभिव्यक्ति का उपयोग कर, कोरिओग्राफर आउटपुट को लॉगकट दृश्य पर छुपा सकते हैं:

टैग: ^ ((?! कोरियोग्राफर) *।) $

मैंने एक रीजेक्स का इस्तेमाल कहीं और समझाया: एक शब्द से मेल खाने के लिए नियमित अभिव्यक्ति जिसमें शब्द नहीं है?