2012-09-13 16 views
9

कहा जाता है, इसके बाद बहुत देर हो चुकी है। मैंने एक असिनकटास्क लिखा और अधिकांश समय इसके कन्स्ट्रक्टर के बीच कोई देरी नहीं हुई और इसके डिनबैकग्राउंड को (0 एमएस देरी) कहा जाता है। लेकिन जब भी पृष्ठभूमि में संपर्क समन्वय हो रहा है, तो मुझे अक्सर अपने AsyncTasks के कन्स्ट्रक्टर और doInBackground के बीच 1-3 सेकंड की देरी का अनुभव होता है। यह देरी मेरी परिस्थितियों में अस्वीकार्य है। मैं समझता हूं कि AsyncTask एक पृष्ठभूमि धागा है और इस समस्या को थ्रेड का उपयोग करके हल किया जा सकता है और इसकी प्राथमिकता को उच्चतम निर्धारित किया जा सकता है। लेकिन मैं जो खोजना चाहता हूं वह है, मुझे कैसे पता चलेगा कि मेरे असिंक टास्क के डिनबैकग्राउंड को क्या कहा जा रहा है? मैंने एडीबी शैल टॉप-एम 10 का उपयोग किया और यह समस्या तब हुई जब प्रक्रिया का उपयोग काफी सामान्य लगता है।AsyncTask के doInBackground AsyncTask :: execute को

किसी भी मदद की सराहना की जाती है।

धन्यवाद

+0

आईएमओ, आमतौर पर यह तुरंत निष्पादित हो जाएगा, अगर कोई अन्य धागा भी चल रहा है, तो यह आपके धागे की जांच करने और उन्हें अच्छी तरह सिंक करने के लिए बहुत कम कर देगा। – Tom

उत्तर

2

हम आम तौर पर JVM द्वारा कार्य समय-निर्धारण के बारे में परेशान नहीं है। और वास्तव में हमें भी परेशान करने की आवश्यकता नहीं है।

यदि आपके आवेदन में जितनी जल्दी हो सके कुछ करने की आवश्यकता है तो इसे स्वयं कन्स्ट्रक्टर में करें या Asynctask के प्री पर उपयोग करें (इसे यूआई थ्रेड पर निष्पादित करें)।

लेकिन मैं सहमत हूं कि एंड्रॉइड AsyncTask में doInBackgroud कॉलिंग में कुछ गड़बड़ है, मैंने स्वयं को देखा था कि इनब्रेग्राउंड को ऑनप्र के बाद नहीं बुलाया गया था। आप इसे भी गूगल कर सकते हैं। कई लोगों ने इसका सामना किया था। मैं पारंपरिक थ्रेड का उपयोग करने के लिए चले गए।

मैंने कोर पर पारंपरिक धागे का उपयोग करके अपना खुद का असिंटास्क लिखा और ऑन पेरे और ऑनपोस्ट की नकल करने के लिए मैंने हैंडलर का उपयोग किया। आप उस विकल्प के लिए भी जा सकते हैं।

1

कार्य को बनाने और निष्पादित करने के बीच अंतर करना महत्वपूर्ण है। (एक ASyncTask के रूप में आपने गौर किया, एक अलग execute() विधि है, साथ ही एक निर्माता है।)

एक धागा बनाना, संभवतः काफी महंगा है तो आपको पता चल सकता अग्रिम में कार्य बनाने, और उसके बाद ही इसे क्रियान्वित कि सही समय, बेहतर परिणाम देता है।

यदि पृष्ठभूमि ऑपरेशन अक्सर बार-बार होने की संभावना है, तो आप यह भी पा सकते हैं कि IntentService, जो पृष्ठभूमि थ्रेड में एक-एक-बार अनुरोध करता है, अधिक उपयुक्त है।

30

मुझे भी इस अवधि का सामना करना पड़ता है, लेकिन अब यह हल हो गया है। नीचे

new AsyncTaskName().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 

बजाय कोड

new AsyncTaskName().execute(); 

कोड का उपयोग करें यह doInbackground देरी से चल रही की समस्या का समाधान होगा।

+1

यह मेरे लिए पूरी तरह से काम किया। कृपया ध्यान दें कि यह एपीआई 11 में जोड़ा गया था और चेतावनी: 'http://developer.android.com/reference/android/os/AsyncTask.html#executeOnExecutorjava.util.concurrent.Executor, पैराम्स ...) ' – Jayrox

+1

यह यह ध्यान दिया जाना चाहिए कि executeOnExecutor का उपयोग एपीआई संस्करण के साथ पहले 11 के रूप में नहीं किया जा सकता है। थ्रेड देखें http://stackoverflow.com/questions/9119627/android-sdk-asynctask-doinbackground-not-running-subclass/23678665#23678665 –

+0

@ मिलान शुक्ला: बहुत बहुत धन्यवाद :-) –

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