2011-06-13 18 views
8

मैं मुद्दों के बिना कई स्थानों में AsyncTask का उपयोग कर रहा हूँ।पैटर्न AsyncTask "प्रक्रियात्मक" बनाने के लिए पैटर्न

अब हनीकॉम के साथ, सभी नेटवर्क I/o को यूआई थ्रेड से अलग थ्रेड में होना चाहिए, जो कई मामलों में स्थानों में AsyncTasks की आवश्यकता होती है, जहां सिंक्रोनस नेटवर्क कनेक्शन से पहले उपयुक्त था (हनीकॉम एक अपवाद फेंक देगा मुख्य/ui थ्रेड पर किसी भी नेटवर्क i/o के लिए)।

अब मैं मूल रूप से Object result = MyAsyncTask().execute() जैसे कुछ प्राप्त करना चाहता हूं, इसके लिए अच्छे पैटर्न हैं?

मुझे AsyncTask Android - Design Pattern and Return Values मिला है जो समझ में आता है और यह भी है कि जीडब्ल्यूटी चीजें कैसे करता है, लेकिन किसी भी तरह यह पूंछ से कुत्ते को कुचलने जैसा लगता है (और फिर यह केवल मुझे हो सकता है कि मस्तिष्क को और अधिक मोड़ने की जरूरत है)।

उत्तर

13

Yup जैसे कुछ के बारे में सोच रहा हूं। तुम करीब हो

Object result = MyAsyncTask().execute().get(); 
+0

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

+7

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

4

मुझे यकीन है कि आप यूआई थ्रेड पर सिंक्रोनस नेटवर्क लेनदेन करने की इच्छा नहीं कर रहे हैं, है ना?

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

+0

हाँ, यूआई थ्रेड पर नहीं। एचसी से पहले यह संभव था (और ऐसे स्थान हैं, जहां यह समझ में आता है), लेकिन एचसी यूआई थ्रेड पर किसी भी नेटवर्क कॉल के लिए अपवाद फेंक देगा। –

1

यदि आप बस अपने धागे को अवरुद्ध करना चाहते हैं, जबकि अन्य धागा नौकरी करता है, तो आप अपना खुद का कार्य अमूर्त लिखने पर विचार कर सकते हैं। मैं

public class MyTask <T> { 
    // define executor here 
    public T execute(Callable<T> c) { 
     Future<T> t = executor.submit(c); 
     return t.get(); 
    } 
} 
संबंधित मुद्दे