2011-11-30 7 views
6

मैं एंड्रॉयड सर्वोत्तम प्रक्रियाओं का पालन करने के लिए है, तो डिबग मोड में मैं बारी कोशिश कर रहा हूँ सब पर निम्नलिखित:क्या एसक्यूएल या सामान्य फ़ाइल का उपयोग एंड्रॉइड मुख्य यूआई थ्रेड में उचित है?

StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectAll().penaltyLog().build()); //detect and log all thread violations 
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectAll().penaltyLog().build()); //detect and log all virtual machine violations 

एंड्रॉयड अब मुझे पर चिल्लाता है जब मैं मुख्य में फ़ाइल पहुँच या SQL किसी भी प्रकार का उपयोग करने का प्रयास (यूआई) धागा। लेकिन मुझे मुख्य थ्रेड में फ़ाइल एक्सेस और/या एसक्यूएल का उपयोग करने के लिए कई सिफारिशें दिखाई देती हैं। उदाहरण के लिए, मुख्य गतिविधि मामले में onCreate() अंदर डिफ़ॉल्ट प्राथमिकता मान लोड करना चाहिए वे अभी तक निर्धारित नहीं किया गया:

PreferenceManager.setDefaultValues(context, resId, readAgain); 

उफ़ --- कि पहले आवेदन निष्पादन पर एक फ़ाइल उपयोग में परिणाम है, क्योंकि onCreate() कहा जाता है यूआई थ्रेड पर। इसके आस-पास एकमात्र तरीका यह है कि मैं एक अलग थ्रेड शुरू करना चाहता हूं --- जो अन्य यूआई कोड के साथ दौड़ की स्थिति पेश करता है जो प्राथमिकताओं को पढ़ सकता है और डिफ़ॉल्ट मानों को पहले से सेट करने की अपेक्षा करता है।

DownloadManager जैसी सेवाओं के बारे में भी सोचें। (वास्तव में, यह इतना है कि यह गाड़ी वास्तविक जीवन में बेकार है, लेकिन यह एक पल के लिए काम करता है नाटक करते है।) यदि आप एक डाउनलोड अप कतार हैं, तो आप एक घटना (मुख्य थ्रेड पर) प्राप्त तुमसे कह एक डाउनलोड समाप्त हो। वास्तव में जो डाउनलोड के बारे में जानकारी (यह केवल आप एक डाउनलोड आईडी देता है), तो आप DownloadManager --- जो एक कर्सर शामिल है, तो आपको एक त्रुटि दे रही है यदि आप एक सख्त नीति को चालू किया हुआ क्वेरी करने के लिए है पाने के लिए।

तो कहानी क्या है --- क्या मुख्य धागे में कर्सर तक पहुंचना ठीक है? या यह एक बुरी चीज है, और आधे एंड्रॉइड डेवलपमेंट टीम और एंड्रॉइड पुस्तक लेखकों ने इसके बारे में भूल गए हैं?

+2

वरीयता प्रबंधक .setDefaultValues ​​में SQL शामिल नहीं है। साझा संदर्भ सभी फ्लैट एक्सएमएल फाइलें हैं। –

+0

हाँ, यह एक सप्ताह रहा है --- मुझे याद नहीं आया। मैंने इस सवाल को संपादित करने के लिए संपादित किया है कि यह एक फ़ाइल पहुंच --- जो एक ही बिंदु है। इसे नोट करने के लिए धन्यवाद। –

+0

अब एंड्रॉइड 4.2.2 एमुलेटर पर, 'वरीयता प्रबंधक .setDefaultValues ​​(संदर्भ, resId, readAgain)' का प्रयोग करते हुए, एक थ्रेड थ्रेड से शुरू होने पर, जो मुख्य थ्रेड _not_ है, गतिविधि को लंबे समय तक स्टैक ट्रेस के साथ "जावा" से भरने से रोक देगा। lang.RuntimeException: थ्रेड के अंदर हैंडलर नहीं बना सकता जिसे Looper.prepare() "नहीं कहा जाता है। तो ऐसा लगता है कि, मुख्य धागे पर फ़ाइलों तक पहुंचने के लिए न केवल ठीक है, अब डिफ़ॉल्ट वरीयता मानों को सेट करने के लिए अब तक अनिवार्य है। –

उत्तर

8

इसके आसपास एकमात्र तरीका यह है कि मैं एक अलग थ्रेड शुरू करना चाहता हूं --- जो अन्य यूआई कोड के साथ दौड़ की स्थिति पेश करता है जो वरीयताओं को पढ़ सकता है और डिफ़ॉल्ट मानों को पहले से सेट करने की अपेक्षा करता है।

फिर एक AsyncTask उपयोग करते हैं, doInBackground() में setDefaultValues() कॉल और "अन्य यूआई कोड है कि प्राथमिकताओं को पढ़ा सकता है" onPostExecute() में डाल।

वास्तव में उस डाउनलोड के बारे में जानकारी प्राप्त करने के लिए (यह आपको केवल एक डाउनलोड आईडी देता है), आपको डाउनलोडमैनर से पूछना होगा --- जिसमें एक कर्सर शामिल है, यदि आपको सख्त नीति चालू है तो आपको एक त्रुटि मिलती है।

तो एक पृष्ठभूमि सूत्र में DownloadManager क्वेरी।

तो कहानी क्या है --- क्या मुख्य धागे में कर्सर तक पहुंचना ठीक है?

यह "ठीक" की आपकी परिभाषा पर निर्भर करता है।

एंड्रॉयड 1.x और सबसे 2.x उपकरणों, फाइल सिस्टम का इस्तेमाल किया पर YAFFS2, जो मूल रूप से सभी प्रक्रियाओं भर में सभी डिस्क पहुँच को धारावाहिक है। शुद्ध प्रभाव है कि जब अपने कोड अलगाव में पर्याप्त रूप से performant प्रकट हो सकता है, क्योंकि अन्य बातों के पृष्ठभूमि में चल रहा है (जैसे, नया ई-मेल को डाउनलोड) के उत्पादन में समय पर सुस्त दिखाई देता है।

हालांकि यह एंड्रॉइड 3.x और ऊपर (वे ext4 पर स्विच किए गए) में कोई समस्या नहीं है, लेकिन कोई सवाल नहीं है कि फ्लैश I/O अभी भी अपेक्षाकृत धीमी है - यह थोड़ा और अनुमानित रूप से धीमा होगा ।

StrictMode यह निर्धारित करने के लिए डिज़ाइन किया गया है कि आलसीता कहां हो सकती है। यह निर्धारित करने के लिए आप पर निर्भर हैं कि कौन सा सौम्य है और कौन नहीं है। एक आदर्श दुनिया में, आप उन्हें सब साफ करेंगे; एक आदर्श दुनिया में, मेरे बाल होंगे।

या यह एक बुरी चीज है, और एंड्रॉइड डेवलपमेंट टीम और एंड्रॉइड पुस्तक लेखकों के आधे के बारे में भूल गए हैं?

यह हमेशा एक "बुरी चीज" रहा है।

मैं "आधे एंड्रॉइड डेवलपमेंट टीम" के लिए बात नहीं कर सकता। मुझे लगता है कि, शुरुआती दिनों में, उन्होंने डेवलपर्स को आलसी व्यवहार का पता लगाने के लिए अपनी मौजूदा विकास विशेषज्ञता लागू करने की उम्मीद की - यह किसी भी अन्य प्लेटफ़ॉर्म में प्रदर्शन समस्याओं से काफी अलग नहीं है। समय के साथ, वे एक कम समस्या को कम करने के लिए सिस्टम-स्तरीय परिवर्तनों (उदाहरण के लिए, YAFFS2-> ext4) के अतिरिक्त, सकारात्मक पथ (उदा।, Loader ढांचे) में डेवलपर्स को चलाने के लिए और अधिक पैटर्न प्रदान कर रहे हैं। कुछ हिस्सों में, वे उन स्थानों को संबोधित करने की कोशिश कर रहे हैं जहां एंड्रॉइड अलग-अलग प्रदर्शन-संबंधी चुनौतियों का परिचय देता है, जैसे सिंगल-थ्रेडेड यूआई।

इसी तरह, मैं सभी एंड्रॉइड पुस्तक लेखकों के लिए बात नहीं कर सकता। मैं निश्चित रूप से अपनी पुस्तकों के शुरुआती संस्करणों में प्रदर्शन मुद्दों पर ध्यान केंद्रित नहीं करता था, क्योंकि मैं एंड्रॉइड सुविधाओं और कार्यों पर ध्यान केंद्रित कर रहा था। समय के साथ, मैंने इन क्षेत्रों में और सलाह दी है। मैंने इन विषयों से संबंधित ओपन सोर्स कोड भी योगदान दिया है। 2012 में, मैं इन मुद्दों को हल करना जारी रखने के लिए, अपनी पुस्तकों में बड़े पैमाने पर संशोधन कर रहा हूं, और अधिक खुली स्रोत परियोजनाएं बनाउंगा। मुझे संदेह है कि, आपका स्वर दिया गया है कि मैं (और शायद अन्य) इस संबंध में आपकी आंखों में पूर्ण विफलताओं हैं, और आप निश्चित रूप से आपकी राय में आपका स्वागत करते हैं।

+0

विस्तृत प्रतिक्रिया के लिए धन्यवाद, हालांकि मुझे अभी भी थोड़ा परेशान महसूस होता है --- मुझे यकीन नहीं है कि यह आपके उत्तर में है या सिर्फ सामान्य स्थिति है। लेकिन मुझे यकीन नहीं है कि आपको वरीयता मान निर्धारित करने के लिए मेरा मुद्दा मिला है। क्या होगा यदि उपयोगकर्ता उसे "कुछ करें" बटन, जो क्रिया प्राथमिकता सेटिंग्स पर निर्भर करती है --- मुझे लगता है कि मुझे InitPreferencesAsyncTask.OnPostExecute() में ध्वज सेट देखना होगा, और यदि यह सेट नहीं है तो एक संवाद दिखाएं, " अभी तक ऐसा नहीं कर सकता --- प्राथमिकताएं लोड नहीं हुई हैं। " इसलिए मेरे प्रश्न का प्रेरणा --- एंड्रॉइड क्रैपी एंटी-पैटर्न के साथ डिज़ाइन किया गया है, या क्या मुझे कुछ याद आ रही है? –

+0

@ गारेट विल्सन: यह स्पष्ट रूप से स्पष्ट है कि आपका उद्देश्य लोगों पर हमला करना है। आप इसे अपने आप कर सकते हैं; मैं साथ खेलने के लिए नहीं जा रहा हूँ। – CommonsWare

+1

एक सेकंड के लिए मुझे नहीं पता था कि आपने किसने सोचा था कि मैं "हमला कर रहा था" --- आखिर में मुझे नहीं पता कि एंड्रॉइड आर्किटेक्चर किसने डिजाइन किया है। तब मुझे एहसास हुआ कि, क्योंकि आपने AsyncTask के उपयोग का सुझाव दिया है, कि आपको यह मानना ​​होगा कि मैं आप पर हमला कर रहा था। यह मामला नहीं था, हालांकि मुझे यकीन नहीं था कि आप मेरी बात समझ गए हैं।आपने किसी समस्या का समाधान करने का सुझाव दिया है, और यदि मैं कुछ भी हमला कर रहा था, तो यह एंड्रॉइड का डिज़ाइन था जिसके लिए इस तरह के काम की आवश्यकता होगी। यह अभी भी मुझे लगता है कि मेरी प्रतिक्रिया केवल एंड्रॉइड डिज़ाइन को परेशान कर रही है और पूछ रही है कि मुझे कुछ याद आ रहा है या नहीं। क्षमा करें अगर आपने इसे अन्यथा लिया है। –

संबंधित मुद्दे