2010-03-22 9 views
15

मैं एक दूरस्थ सर्वर से बहुत से थंबनेल ला रहा हूं और उन्हें AsyncTask का उपयोग करके ग्रिड व्यू में प्रदर्शित कर रहा हूं। समस्या यह है कि, मेरा ग्रिड व्यू एक समय में 20 थंबनेल प्रदर्शित करता है, जिससे 20 AsyncTasks बनाता है और 20 निष्पादन शुरू होता है, एक थंबनेल प्रति।AsyncTask, अस्वीकृत एक्सेक्यूशन अपवाद और कार्य सीमा

मुझे अपने कोड में RejectedExecution अपवाद मिलता है। मुझे कहीं और पढ़ना याद है कि एक समय में एसिंक टास्क की कतार में कितनी कार्रवाइयां हो सकती हैं, मैं इसे मार रहा हूं। क्या यह बार उठाया गया था?

क्या इस सीमा को बढ़ाने का कोई तरीका है? क्या इस अपवाद को अनदेखा करना सुरक्षित है? (catch(RejectedException e){} ब्लॉक खाली करके)

मैं एंड्रॉइड 1.6 एमुलेटर और मेरे कोड में एपीआई स्तर पर यह कोड चला रहा हूं (minSDKVersion 3 है)। [संपादित करें: जोड़ा गया एसडीके और एपीआई स्तर की जानकारी]

उत्तर

17

मैंने कहीं पढ़ने कि वहाँ कार्यों AsyncTask एक समय में अपनी कतार में हो सकता है की संख्या की कोई सीमा, मैं कि मार हो सकता है याद। इस बार उठाया गया था?

AsyncTask वर्तमान में 10 धागे और 10 सिद्धांत रूप में की एक काम कतार गहराई, कि सिर्फ 20 आइटम का समर्थन करेगा ... अगर और कुछ नहीं AsyncTask उपयोग कर रहा है समर्थन करने के लिए प्रकट होता है।

क्या इस सीमा को बढ़ाने का कोई तरीका है?

स्रोत कोड प्राप्त करें, इसे संशोधित करें, इसे अपने पैकेज में रखें, और उस का उपयोग करें। मैंने इसे अपने AsyncTaskEx के साथ किया, हालांकि यह एंड्रॉइड 1.5 स्रोत पर आधारित है।

क्या यह अपवाद को अनदेखा करना सुरक्षित है?

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

+0

धन्यवाद आपके उत्तर के लिए और अपने कोड को साझा करने के लिए भी धन्यवाद! बीटीडब्लू, रोमैन गाय की टिप्पणी के अनुसार यहां: http://stackoverflow.com/questions/990948/simple-thread-management-java-android सीमा को आराम से देखा गया है। – Samuh

+0

दुर्भाग्यवश, मैं उनके बयान की पुष्टि नहीं कर सकता। मेरे ऊपर जो स्रोत है, वह स्रोत कोड की मेरी परीक्षा से है (जैसा कि Google Code Search के माध्यम से मिलता है)। हालांकि, मैं कोड को गलत तरीके से पढ़ रहा हूं। – CommonsWare

+0

मैं एक ही मुद्दा मार रहा हूं। मैं अपने कार्यों को समानांतर में अनुक्रम में निष्पादित करने के लिए पूरी तरह से खुश हूं। क्या इसे करने का कोई तरीका है? या मैं एक कार्य कतार लागू करने के लिए वापस जा रहा हूँ? –

1

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

7

मैंने एक ही ऐप्लिकेशन में यह वही काम किया है।

सर्वर से थंबनेल डाउनलोड करने के लिए 20 समानांतर धागे लॉन्च करना और उन्हें डेटा एडाप्टर पर धक्का देना मेरे लिए एक अच्छा विचार नहीं है। वे सभी धागे एक दूसरे के ऊपर यात्रा करेंगे और एक दूसरे के रास्ते में आ जाएंगे।

इसके बजाय, मैं केवल एक धागा लॉन्च करता हूं, इसे लूप में थंबनेल एकत्र करता हूं, और उन्हें आने पर एडाप्टर में जोड़ता है।

2

आप अपने कार्यों को क्रमबद्ध करने के लिए AsyncTask.executeOnExecutor के साथ धारावाहिक निष्पादक का उपयोग कर सकते हैं, लेकिन उस समय कार्य को केवल एक समवर्ती कार्य तक ही सीमित कर दिया जाएगा। हालांकि थंबनेल प्राप्त करते समय अच्छा हो सकता है:

myAsyncTask.executeOnExecutor (MyAsyncTask।SERIAL_EXECUTOR, [पैराम्स]);

2

समस्या यह है कि AsyncTask.THREAD_POOL_EXECUTOR के लिए AsyncTasks लंबित की संख्या 128 है एक बार कतार भरा है कोई नया AsyncTasks पंक्तिबद्ध किया जा सकता है।

AsyncTask स्रोत कोड से:

private static final BlockingQueue<Runnable> sPoolWorkQueue = 
     new LinkedBlockingQueue<Runnable>(128); 

मेरी राय में उस सीमा सब पर बिल्कुल नहीं समझ में आता है और AsyncTask.SERIAL_EXECUTOR एक असीमित कतार है।

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