क्या AsyncTask.doInBackground
सिंक्रनाइज़ करना संभव है - या एक ही परिणाम को एक और तरीके से प्राप्त करना संभव है?क्या एंड्रॉइड AsyncTask doInBackground कार्य निष्पादन को क्रमबद्ध करने के लिए सिंक्रनाइज़ किया जा सकता है?
class SynchronizedTask extends AsyncTask {
@Override
protected synchronized Integer doInBackground(Object... params) {
// do something that needs to be completed
// before another doInBackground can be called
}
}
मेरे मामले में, किसी भी AsyncTask.execute()
पिछले एक पूरा कर लिया है से पहले शुरू किया जा सकता है, लेकिन मैं के बाद ही पिछले कार्य समाप्त हो गया है doInBackground
में कोड निष्पादित करने के लिए की जरूरत है।
EDIT: जैसा कि सही ढंग से इंगित किया गया है, सिंक्रनाइज़ेशन केवल उसी ऑब्जेक्ट उदाहरण पर काम करता है। दुर्भाग्यवश, AsyncTask
बनाने और execute()
को उसी ऑब्जेक्ट उदाहरण पर एक से अधिक बार कॉल करना संभव नहीं है, जैसा कि AsyncTask
documentation के "थ्रेडिंग नियम" खंड में निर्दिष्ट है।
समाधान को संदर्भित करने के लिए कस्टम Executor का उपयोग करना है, या यदि आप एपीआई 11 या ऊपर, AsyncTask.executeOnExecutor()
का उपयोग करते हैं, जैसा कि नीचे दी गई टिप्पणियों में सुझाया गया है।
मैंने an answer को SerialExecutor
के कार्यान्वयन को दिखाया है जिसका उपयोग कार्यों को कतारबद्ध करने के लिए किया जा सकता है जो अनुक्रमिक रूप से निष्पादित किए जाएंगे।
यही कारण है कि सिंक्रनाइज़ साधन नहीं है
यहाँ कोड है!इसका मतलब है कि फ़ंक्शन (या ब्लॉक) को इस ऑब्जेक्ट पर किसी अन्य थ्रेड के साथ इंटरलेविंग किए बिना निष्पादित किया जाता है। – Bondax
@ बॉन्डैक्स हाँ, मुझे पता है। लेकिन दस्तावेज के अनुसार, 'doInBackground' को विभिन्न पृष्ठभूमि धागे द्वारा बुलाया जा सकता है। चूंकि यूआई थ्रेड पिछले एक से पहले किसी भी समय 'नया सिंक्रनाइज़ टास्क() 'कॉल कर सकता है, इसलिए आपके पास एक ही समय में' doInBackground' निष्पादित करने वाले दो या दो से अधिक भिन्न इंटरलिविंग थ्रेड हो सकते हैं। –
हां, लेकिन विभिन्न AsyncTask उदाहरणों पर! – Bondax