5

मेरे पास मेरे प्रोजेक्ट में कई गतिविधि उप-वर्ग हैं, प्रत्येक एक एसओएपी आधारित वेब सेवा, प्रसंस्करण और परिणामों को प्रदर्शित करता है। एसओएपी क्रमबद्धता, कॉल हैंडलिंग और परिणामस्वरूप विभिन्न पीओजेओ वस्तुओं में पार्सिंग MyWebService क्लास में encapsulated है। यह वर्ग वास्तविक वेब सेवा कॉल को AsyncTask के माध्यम से निष्पादित करता है।पैटर्न कई एंड्रॉइड पर एंड्रॉइड AsnycTask का पुन: उपयोग करने के लिए पैटर्न?

कॉलिंग गतिविधि उपclass में परिणामों को वापस करने में सक्षम होने के लिए, मैंने सोचा कि मैं इन सभी गतिविधियों को एक WebServiceResultProcessor इंटरफ़ेस को कार्यान्वित करना चाहिए, एक एकल फ़ंक्शन (processWebServiceResults) को परिभाषित करना चाहिए जो AsyncTask के लिए कॉलबैक के रूप में कार्य करता है, जिसेपोस्टएक्सक्यूट से बुलाया जाता है ।

मैं वेब सेवा कॉल के दौरान एक प्रोग्रेसडिअलॉग भी प्रदर्शित करना चाहता हूं। और यहाँ मेरा सवाल आता है। प्रोग्रेसडिअलॉग (या तो MyWebService या इसके AsyncTask से) को प्रदर्शित करने में सक्षम होने के लिए, मुझे कॉलर गतिविधि के संदर्भ का संदर्भ पारित करने की आवश्यकता है। और AsyncTask से कॉलबैक फ़ंक्शन निष्पादित करने में सक्षम होने के लिए, मैं भी को उसी ऑब्जेक्ट संदर्भ को पास करने की आवश्यकता है, लेकिन इस बार WebServiceResultProcessor के रूप में। यह मुझे एक कोड गंध लगता है, एक ही वस्तु को दो बार गुजर रहा है, लेकिन उसके चारों ओर किसी भी तरह से नहीं देख सकता है। इंटरफेसिंग के बजाय, मैं एक नई बेस क्लास बना सकता हूं, गतिविधि वर्ग का विस्तार कर सकता हूं और एक्सटेंशन क्लास से विरासत को लागू कर सकता हूं, लेकिन इसका मतलब यह होगा कि मैं ListActivity और इस MyWebService क्लास का उपयोग करने से पसंद को बाहर कर दूंगा।

क्या ऐसा करने का कोई बेहतर तरीका है?

+0

अपने WebServiceResultProcessor का विस्तार करता है प्रसंग/गतिविधि? –

+0

@HeikoRupp नहीं, और शायद मैं इसे इस तरह से रखना पसंद करूंगा। –

उत्तर

0

अरहिम की चेतावनी के बावजूद, मैं AsyncTask का उपयोग कर समाप्त हुआ, क्योंकि यह अभी भी मेरे उद्देश्यों के अनुरूप है। मैं बस यह सुनिश्चित करता हूं कि वेब सेवाओं को कॉल करने वाली सभी गतिविधियां, उनके onDestroy() पर, cancel() को आविष्कार AsyncTask पर भेजें। AsyncTask कार्यान्वयन स्वयं को जरूरी रद्द कर अनुरोध को संभालकर संभालता है() जहां भी आवश्यक हो।

मूल प्रश्न के रूप में, मुझे एक चूक होनी चाहिए - समाधान वास्तव में सरल है।मैं गतिविधि सबक्लास उदाहरण को AsyncTask के ऑब्जेक्ट के रूप में पास करता हूं, और इसे आवश्यकतानुसार संदर्भ या WebServiceResultProcessor पर डाल देता हूं। टुकड़े दिखा कि यह कैसे काम करता है:

if (callerActivity instanceof Context) { 
    ProgressDialog dialog = new ProgressDialog((Context)callerActivity); 
} 

...

if (callerActivity instanceof WebServiceResultProcessor) { 
    ((WebServiceResultProcessor)callerActivity).processWebServiceResults(soapObject); 
} 
+1

मुझे लगता है कि अगर (कॉलर सक्रियता उदाहरण संदर्भ) {..} 'एक अनावश्यक जांच है। जब तक कि मैं आपके मामले में 'कॉलर एक्टिविटी' कुछ भी नहीं खो रहा हूं, हमेशा 'संदर्भ' का उदाहरण होगा, ताकि आप सीधे प्रगति निर्माण कोड को कॉल कर सकें। –

4

+1, एक अच्छा सवाल है!

यह आपके प्रश्न पर सीधा जवाब नहीं है। हालांकि मुझे लगता है कि मुझे लगता है कि AsyncTask ऐसी चीजों के लिए सही विकल्प नहीं है। मुझे ऐसा लगता है क्योंकि इस मामले में AsyncTaskActivity (ProgressDialog उदाहरण के माध्यम से या कॉलबैक onPostExecute() से कॉल करने के लिए) का संदर्भ रखता है।

बस कल्पना करें: एंड्रॉइड में ओएस Activity को AsyncTask से पहले doInBackground() निष्पादित कर सकता है। यह निश्चित रूप से, कुछ प्रकार के कोने के मामले में है, लेकिन यह असंभव नहीं है। एक परिदृश्य पर विचार करें: उपयोगकर्ता को आने वाली कॉल मिलती है, आपकी गतिविधि अदृश्य हो जाती है, ओएस को कुछ और रैम की आवश्यकता होती है और इस प्रकार यह आपकी गतिविधि को मारने का फैसला करता है। कम से कम एक स्मृति रिसाव मामला।

मुझे नहीं पता कि क्यों Google सचमुच जानकारी को छुपाता है कि UI कार्यों को पृष्ठभूमि कार्यों से कैसे ठीक से अलग किया जाना चाहिए। हां, वे कहते हैं "एक सेवा का उपयोग करें"। लेकिन यह एक मामूली उपक्रम नहीं है। यह एक दयालुता है Google लगभग हर विकास विषय के लिए अच्छा गाइड प्रदान करता है, लेकिन इस पर नहीं। फिर भी मैं प्रेरणा के लिए "Google I/O 2010 - Android REST client applications" प्रस्तुति की जांच करने का सुझाव दे सकता हूं। ऐसा लगता है कि उन्होंने एंड्रॉइड में ऐसी चीजों को कैसे किया जाना चाहिए, इस पर एक कुंजी दी।

+0

AsyncTask के भीतर संदर्भ संदर्भ का उपयोग कर खतरों को इंगित करने के लिए धन्यवाद। मुझे यह http://stackoverflow.com/questions/3357477/is-asynctask-really-conceptually-flawed-or-am-i-just-missing- इस विषय को काफी व्यापक रूप से कवर करने के लिए कुछ प्रश्न और उत्तर मिलते हैं। –

+0

@ András Szepesházi: धन्यवाद, यह एक अच्छी चर्चा है। लेकिन, वे ज्यादातर चर्चा करते हैं कि कॉन्फ़िगरेशन में बदलाव कैसे करें (जैसे डिवाइस रोटेशन पर गतिविधि पुनरारंभ)। लेकिन क्या होगा अगर मेरे परिदृश्य (इनकमिंग कॉल) द्वारा वर्णित गतिविधि में मार डाला गया हो, जबकि एक एसिंक्टास्क है जो रिमोट सर्वर पर नया उपयोगकर्ता खाता बनाता है? :) खाता बनाया जाएगा, लेकिन जब उपयोगकर्ता गतिविधि पर वापस आ जाता है, तो यह एसिंक्टास्क के परिणाम को कभी नहीं जानता। तो उपयोगकर्ता पुनः प्रयास करेंगे और "ऐसा उपयोगकर्ता नाम पहले से ही उपयोग किया जा रहा है" त्रुटि प्राप्त करें? :) ठीक है, क्या होगा अगर asycntask भुगतान लेनदेन किया था? :) –

+0

वाह यह बुरा है। मैं सेवाओं और हैंडलर का उपयोग करने से बचना चाहता था, लेकिन ऐसा लगता है कि यह जाने का एकमात्र तरीका है। –

3

आप इस ब्लॉग आलेख (part 1 और part 2) में देख सकते हैं, जो AsyncTaskLoader के साथ एक वेब सेवा लागू करता है और एक सेवा घटक के साथ एक ही वेब सेवा लागू करता है। इसके अलावा यह दोनों दृष्टिकोणों के बीच अंतर दिखाता है और लेख में भी दिलचस्प टिप्पणियां हैं।