2011-01-29 11 views
9

एक परिदृश्य में जहाँ मैं एक यूआई कि एक अलग थ्रेड (AsyncTask का प्रयोग करके) से अपडेट किया जाएगा है में, मैं गतिविधि का एक आंतरिक वर्ग के रूप में AsyncTask परिभाषित कर सकते हैं, लेकिन यह दो कमियां है मैं समस्याग्रस्त लगता है:Android AsyncTask से गतिविधि UI परिवर्तन कैसे करें?

  1. यह कोड
  2. यह यह मुश्किल धागा वर्ग

एक अच्छा समाधान क्या है पुन: उपयोग के लिए बनाता है के प्रबंधन में दक्षता को कम स्रोत फ़ाइलों बहुत बड़ी बना देता है,? एक आंतरिक वर्ग का प्रयोग करें, लेकिन अन्य वर्गों में यह सबकुछ अमूर्त है? AsyncTask को गतिविधि का संदर्भ पास करें? हमेशा AsyncTask क्लास को एक आंतरिक कक्षा के रूप में परिभाषित करें और केवल स्रोत फ़ाइलों को स्वीकार करें बड़ा होगा?

उत्तर

2

मैंने देखा है कि कुछ उदाहरण मैंने को AsyncTask के निर्माता में पास किया है।

public class BackgroundStuff extends AsyncTask<Void, Void, Void> { 
    ... 
    Context mContext; 
    ... 
    BackgroundStuff(Context context){ 
     super(); 
     this.mContext = context; 
    } 
    ... 
} 

मुझे यह जानने में दिलचस्पी होगी कि कोई और कोई अन्य दृष्टिकोण उपयोग करता है या नहीं।

+0

कक्षा में एक संदर्भ पास करना जो मैं वर्तमान में करता हूं, यह बदसूरत लगता है, लेकिन शायद कोई बेहतर तरीका नहीं है। –

13

सबसे पहले: जब एक AsyncTask का उपयोग कर आप doInBackground() भीतर यूआई गतिविधि नहीं करना चाहिए।

आप क्या कर सकते हैं - यदि आप उदा। लंबे समय तक चलने वाली पृष्ठभूमि नौकरी के लिए अद्यतन स्थिति, doInBackground() से publishProgress(values) पर है। रनटाइम तब उन मानों के लिए आपके onProgressUpdate(values) कॉलबैक को कॉल करेगा, जो यूआई थ्रेड में चलता है और जहां से आप यूआई अपडेट कर सकते हैं।

उदा। उदाहरण देखने के लिए https://github.com/pilhuhn/ZwitscherA/blob/master/src/de/bsd/zwitscher/TweetListActivity.java#L336

AsyncTask को अपनी कक्षा फ़ाइल में कार्यान्वित किया जा सकता है।

+0

DoInBackground() विधि यूआई तक नहीं पहुंच सकती है, फ्रेमवर्क एक अपवाद फेंकता है अगर यह कोशिश करता है। लेकिन मेरा प्रश्न इस बात से संबंधित है कि AsyncTask सबक्लास वास्तव में यूआई तक कैसे पहुंचता है। –

+0

@ ओली मैं यही कहता हूं: doInBackgrround() को UI तक नहीं पहुंचना चाहिए। या तो प्रगति को प्रकाशित करके इसे पहले से या बाद में पोस्ट करें | PostExecute() या बीच में करें। उन तीन कॉलबैक विधियों को UI –

0

मेरे पास असिनक टास्क के साथ कुछ हद तक पीओवी है क्योंकि मैं आम तौर पर सामान्य थ्रेड का उपयोग करना पसंद करता हूं, लेकिन अनिवार्य रूप से जिस तरह से मैं पृष्ठभूमि कार्य करता हूं और यूआई अपडेट करता हूं, ऑनक्रेट() विधि के अंत में हैंडलर बनाता है, मैं फिर हैंडल मैसेज (संदेश संदेश) विधि ओवरराइड करें।

फिर मेरे थ्रेड में, मैं हैंडलर को पैरामीटर के रूप में पास कर दूंगा, फिर जब मैं एक अद्यतन करना चाहता हूं तो मैं थ्रेड से हैंडलर को एक संदेश भेजूंगा, अब यह नया से संवाद करता है यूआई पर काम संसाधित करने के लिए यूआई थ्रेड पर पृष्ठभूमि धागा।

अब मुझे लगता है कि AsyncTasks एक समान कार्य करता है लेकिन हैंडलर हैंडल मैसेज विधि को ओवरराइड करने की आवश्यकता को हटा देता है।

यह इन दो दृष्टिकोणों के बीच किसी भी फायदे/नुकसान के बारे में और अधिक दिलचस्प सीखना होगा।

+0

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

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