2010-04-27 12 views
6

क्या यह संभव है, एक AsyncTask के भीतर से जो गतिविधि गतिविधि वर्ग का एक आंतरिक वर्ग नहीं है, जिसने शुरू की गई गतिविधि के उदाहरण का संदर्भ प्राप्त किया है AsyncTask का निष्पादन?AsyncTask से कॉलिंग गतिविधि को संदर्भित करना (एक आंतरिक वर्ग के रूप में नहीं)

मुझे this thread के बारे में पता है, हालांकि यह बिल्कुल सही नहीं है कि कॉलिंग गतिविधि का संदर्भ कैसे दिया जाए। कुछ लोग एसिंक टास्क कन्स्ट्रक्टर के पैरामीटर के रूप में गतिविधि के संदर्भ को पारित करने का सुझाव देते हैं, हालांकि, यह बताया गया है कि ऐसा करने से हमेशा नलपोइंटर अपवाद होता है।

तो, मैं एक नुकसान में हूँ। मेरा AsyncTask मजबूत कार्यक्षमता प्रदान करता है, और मैं इसे में प्रत्येक गतिविधि में उपयोग करने के लिए एक आंतरिक कक्षा के रूप में डुप्लिकेट करना नहीं चाहता हूं। एक सुरुचिपूर्ण समाधान होना चाहिए।

उत्तर

10

"सुरुचिपूर्ण समाधान" वास्तव में एक पैरामीटर के रूप में यह गुजर (निर्माता या execute() करने के लिए) की कोशिश करना करें और देखें कि यह, काम करता है बल्कि जो व्यक्ति से पूछा कि पिछले प्रश्न (तब दो बार अपने ही सवाल का जवाब यह सोचते हैं की तुलना में है) जानता है कि वह क्या कर रहा है। मैं AsyncTask के लिए आंतरिक कुछ भी नहीं सोच सकता जो खराब कन्स्ट्रक्टर पैरामीटर होने के लिए Activity का कारण बनता है और हर दूसरी वस्तु ठीक है।

अब, मैं Activity (या अन्य Context) एक AsyncTask के लिए एक पैरामीटर के रूप में एक पारित नहीं किया है, मेरे AsyncTasks हमेशा से रहे हैं क्योंकि निजी इनर क्लासों। असल में, तथ्य यह है कि एक सार्वजनिक AsyncTask मेरे लिए एक कोड गंध है, यह सुझाव देते हुए कि इन कार्यों को Service या कुछ अन्य नियंत्रण बिंदु से मध्यस्थ किया जाना चाहिए। लेकिन, यह सिर्फ मुझे है।

अद्यतन

इस पैटर्न से निपटने के लिए एक बेहतर जवाब यहां पाया जा सकता: Background task, progress dialog, orientation change - is there any 100% working solution?

+0

प्वाइंट बस * खुद के लिए कोशिश कर रहा है * यह पहली पर ले लिया:

public abstract RemoteListActivity<T> extends ListActivity{ // calls AsyncTask, shows spinning progress dialog, etc protected abstract T someConcreteMethod(); } public final class CustomerListActivity extends RemoteListActivity<Customer>{ protected final Customer someConcreteMethod(); } 

वैकल्पिक रूप से, अगर चीजें एक भी पदानुक्रम में फिट नहीं है, एक अंतरफलक है। मैं उत्सुक हूं कि आप मेरी स्थिति को कैसे संभालेंगे: यह कुछ भी जटिल नहीं है; मैं मूल रूप से पास किए गए यूआरएल पर मूल http GET अनुरोध करने के लिए एक डाउनलोडफाइलटास्क बनाने की कोशिश कर रहा हूं, और फिर एप्लिकेशन वर्तमान गतिविधि/स्थिति के आधार पर डाउनलोड की गई फ़ाइलों के साथ अलग-अलग चीजें करेगा। मेरे पास अलग-अलग गतिविधियां हैं जिन्हें विभिन्न उद्देश्यों के लिए फ़ाइलों को डाउनलोड करने की आवश्यकता है। क्या यह बेहतर सेवा या किसी अन्य समाधान के साथ किया जाएगा? – stormin986

+4

आह, मैं देखता हूं। जैसा कि मैंने इसे देखा है, आपके पास दो विकल्प हैं। एक 'डाउनलोडफाइल टास्क' को सार्वजनिक लेकिन अमूर्त बनाना है, और उसमें दी गई गतिविधि के लिए अद्वितीय चीजों के लिए निजी आंतरिक वर्ग कार्यान्वयन है। दूसरा 'डाउनलोडफाइल टास्क' सार्वजनिक बनाना और कन्स्ट्रक्टर में * कुछ * पास करना है। इस मामले में, युग्मन को कम करने के लिए, हो सकता है कि आप 'गतिविधि' को पारित नहीं करना चाहते हैं, लेकिन कुछ अन्य प्रकार के इंटरफ़ेस जो 'AsyncTask' को सीमित कर सकते हैं। इस तरह, आप 'गतिविधि', या एक अलग वस्तु के रूप में, या जो कुछ भी इंटरफ़ेस को कार्यान्वित करना चुन सकते हैं। – CommonsWare

+0

सीडब्ल्यू, आप मेरे बहुत सारे पर बहुत मददगार रहे हैं, इसलिए धन्यवाद! अगर मैं वास्तव में एक सार्वजनिक AsyncTask में अपनी गतिविधि का एक उदाहरण पास कर सकता हूं, तो मुझे लगता है कि यह यहां जाने का सबसे अच्छा तरीका है। आप युग्मन युग्मन का उल्लेख करते हैं ... आप इसका क्या मतलब रखते हैं और आप किस प्रकार की स्थितियों से आम तौर पर इससे बचना चाहते हैं? – stormin986

4

मेरे AsyncTask रों हमेशा एक अलग पैकेज में रहते हैं, जबकि अभी भी Activity की एक विशेष प्रकार के लिए बाध्य। वे स्थानीय चर में कन्स्ट्रक्टर और स्टोर में इसका उदाहरण स्वीकार करते हैं।
Activity कक्षा बनाने के संदर्भ में सोचने का प्रयास करें जो AsyncTask-संबंधित सामग्री को समाहित करता है और अन्य गतिविधियों द्वारा बढ़ाया जाता है।
तो जैसा:

interface LazyLoadable { 
    void setLoadingState(); 
    void setDefaultState(); 
} 

public class MyActivity extends Activity implements LazyLoadable{ 
} 

public final class AsyncTask extends AsyncTask<Void, Void, Void>{ 

    private final LazyLoadable lazyLoadable; 

    public MyAsyncTask(Context ctx, LazyLoadable lazyLoadable){ 
     super(ctx); 
     this.lazyLoadable = lazyLoadable; 
    } 

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