Android SDK AsyncTask doInBackground नहीं चल रहा है (उपवर्ग)


90

15/2/2012 तक मुझे अभी तक न तो एक अच्छी व्याख्या मिल पाई है और न ही इस कारण से कि यह काम नहीं करता है। एक समाधान के सबसे करीब पारंपरिक थ्रेड दृष्टिकोण का उपयोग करना है , लेकिन फिर एंड्रॉइड एसडीके में एक वर्ग को क्यों नहीं (प्रतीत होता है) काम करना शामिल है?

शाम 'तो!

मेरे पास एक AsyncTask उपवर्ग है:

// ParseListener had a callback which was called when an item was parsed in a
// RSS-xml, but as stated further down it is not used at all right now.
private class xmlAsync extends AsyncTask<String, RSSItem, Void> implements ParseListener

इसे इस तरह निष्पादित किया जाता है:

xmlAsync xmlThread = new xmlAsync();

xmlThread.execute("http://www.nothing.com");

अब यह उपवर्ग थोड़ी सी त्रुटि में चला गया है। पहले यह कुछ xml- पार्सिंग करता था, लेकिन जब मैंने देखा कि यह doInBackground () नहीं कहा जाता है तो मैंने इसे नीचे छोड़ दिया, लाइन से लाइन, अंत में बस इस के साथ समाप्त:

@Override
protected Void doInBackground(String... params) 
{
    Log.v(TAG, "doInBackground");
        return null;
}

जो, किसी कारण से, कुछ भी नहीं लॉग किया। हालाँकि, मैंने इसे जोड़ा:

@Override
protected void onPreExecute() 
{
        Log.v(TAG, "onPreExecute");
        super.onPreExecute();
}

और धागा निष्पादित करते समय वह रेखा वास्तव में लॉग होती है। तो किसी तरह onPreExecute () कहा जाता है, लेकिन doInBackground () नहीं । मेरे पास एक ही समय में पृष्ठभूमि में चलने वाला एक और AsyncTask है जो बस ठीक काम करता है।

मैं वर्तमान में उत्तरी ध्रुव के करीब एक एमुलेटर, एसडीके संस्करण 15, ग्रहण, मैक ओएस एक्स 10.7.2 पर ऐप चला रहा हूं।

संपादित करें:

@Override
    protected void onProgressUpdate(RSSItem... values) {

        if(values[0] == null)
        {
                            // activity function which merely creates a dialog
            showInputError();
        }
        else
        {

            Log.v(TAG, "adding "+values[0].toString());
            _tableManager.addRSSItem(values[0]);
        }


        super.onProgressUpdate(values);
    }

_tableManager.addRSSItem () कम या ज्यादा SQLiteDatabase के लिए एक पंक्ति जोड़ता है, जो गतिविधि के संदर्भ के साथ प्रारंभ होता है। पब्लिशप्रोप्रोग्रेस () को इंटरफ़ेस पारसेलिस्टनर के कॉलबैक द्वारा कहा जाता है। हालाँकि, चूंकि मैं doInBackground () में log.v को छोड़कर कुछ भी नहीं करता हूं, इसलिए मैंने पहली बार इस अनावश्यक को भी लाया।

संपादित करें 2:

ठीक है, बस पूरी तरह से स्पष्ट होने के लिए, यह अन्य AsyncTask है, एक ही गतिविधि में निष्पादित और पूरी तरह से ठीक काम कर रहा है।

private class dbAsync extends AsyncTask<Void, RSSItem, Void>
{
    Integer prevCount;
    boolean run;

    @Override
    protected void onPreExecute() {
        run = true;
        super.onPreExecute();
    }

    @Override
    protected Void doInBackground(Void... params) {
        // TODO Auto-generated method stub
        run = true;
        prevCount = 0;

        while(run)
        {
            ArrayList<RSSItem> items = _tableManager.getAllItems();

            if(items != null)
            {
                if(items.size() > prevCount)
                {
                    Log.v("db Thread", "Found new item(s)!");
                    prevCount = items.size();

                    RSSItem[] itemsArray = new RSSItem[items.size()];

                    publishProgress(items.toArray(itemsArray));
                }
            }               

            SystemClock.sleep(5000);
        }

        return null;
    }

    @Override
    protected void onProgressUpdate(RSSItem... values) {

        ArrayList<RSSItem> list = new ArrayList<RSSItem>();

        for(int i = 0; i < values.length; i++)
        {
            list.add(i, values[i]);
        }

        setItemsAndUpdateList(list);

        super.onProgressUpdate(values);
    }

    @Override
    protected void onCancelled() {
        run = false;

        super.onCancelled();
    }
}

संपादित करें 3:

आह, माफ करना, मैं सवाल पूछने में बुरा हूँ। लेकिन यहां टास्क की शुरुआत है।

xmlAsync _xmlParseThread;
dbAsync _dbLookup;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

_dbLookup = new dbAsync();
_dbLookup.execute();

_xmlParseThread = new xmlAsync();       
_xmlParseThread.execute("http://www.nothing.com", null);
}

क्या यह संभव है कि कार्य पूरा होने से पहले गतिविधि समाप्त हो जाए?
पॉल निकोविक्ज़

लगभग नामुमकिन। उस स्थिति में मेरा दूसरा धागा सही नहीं चल रहा होगा? और मेरे पास अभी केवल एक गतिविधि है।
20

2
मेरे ऐप में एक ही समस्या है - doInBackground को या तो कॉल नहीं किया जाता है या बहुत लंबी देरी के साथ बुलाया जाता है। यहां मेरा सीमित अवलोकन है: ठीक उसी तरह यह कोड एंड्रॉइड 2.3.3 स्मार्टफोन और एंड्रॉइड 2.3.3 एमुलेटर पर निर्दोष रूप से काम करता है, लेकिन एंड्रॉइड 4.0.3 टैबलेट और एंड्रॉइड 4.xx एमुलेटर का एक गुच्छा पर यह समस्या है। यह निष्कर्ष निकालना बहुत लुभावना है कि यह समस्या Android के नए संस्करणों में पेश की गई थी।
हाँग

क्षमा करें, लेकिन मैं इस समस्या का उल्लेख करना भूल गया केवल एक गतिविधि के दूसरे AsyncTask के साथ होता है पहला AsyncTask हमेशा ठीक काम करता है।
हाँग

हाँ, क्या आपने मैथ्यू का जवाब देने की कोशिश की है? मैं ज्यादातर एंड्रॉइड गेम एटीएम से बाहर रहा हूं और इसके साथ थोड़ी देर के लिए काम नहीं किया है, इसलिए मैं नहीं बता सकता कि क्या उसके जवाब वास्तव में काम करते हैं। अगर यह आपके लिए नहीं है, तो शायद मुझे उसका जवाब स्वीकार करना बुरा था ...
SeruK

जवाबों:


107

मैथ्यू का समाधान अधिकांश के लिए ठीक काम करेगा, लेकिन कुछ समस्या का सामना कर सकते हैं; जब तक यहाँ या वेब से प्रदान किए गए कई लिंक्स में खुदाई नहीं की गई, जैसे एंडर्स गॉर्सन की व्याख्या। मैं यहाँ कुछ अन्य पढ़ता संक्षेप में प्रस्तुत करने की कोशिश कर रहा हूँ और जल्दी से समाधान की व्याख्या कर रहा हूँ यदि निष्पाद्य निष्पादनकर्ता अभी भी एक सूत्र में काम कर रहा है ...

का व्यवहार AsyncTask().execute();Android संस्करण के माध्यम से बदल गया है। डोनट से पहले (एंड्रॉइड: 1.6 एपीआई: 4) कार्यों को क्रमानुसार निष्पादित किया गया था, डोनट से जिंजरब्रेड (एंड्रॉइड: 2.3 एपीआई: 9) कार्यों को निष्पादित किया गया; चूंकि हनीकॉम्ब (एंड्रॉइड: 3.0 एपीआई: 11) निष्पादन को अनुक्रमिक रूप से वापस स्विच किया गया था; AsyncTask().executeOnExecutor(Executor)हालांकि, एक नई विधि को समानांतर निष्पादन के लिए जोड़ा गया था।

अनुक्रमिक प्रसंस्करण में सभी Async कार्य एक ही थ्रेड में चलते हैं और इस तरह पिछले कार्य के समाप्त होने से पहले इंतजार करना पड़ता है। यदि आपको तुरंत कोड निष्पादित करने की आवश्यकता है, तो आपको अलग-अलग थ्रेड्स में समानांतर में संसाधित किए जाने वाले कार्यों की आवश्यकता है।

AsyncTask के साथ डोनट और हनीकॉम्ब संस्करणों के बीच धारावाहिक निष्पादन उपलब्ध नहीं है, जबकि डोनट से पहले समानांतर निष्पादन उपलब्ध नहीं है।

डोनट के बाद समानांतर प्रसंस्करण के लिए: बिल्ड संस्करण की जाँच करें और उस उपयोग के आधार पर .execute () या .executeOnExecutor () विधि। निम्नलिखित कोड मदद कर सकता है ...

AsyncTask<Void,Void,Void> myTask = new AsyncTask<Void,Void,Void>() { ... }; // ... your AsyncTask code goes here
if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB)
    myTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
else
    myTask.execute();

NOTE:फंक्शन .executeOnExecutor()में चेक होता है targetSdkVersionकि प्रोजेक्ट कम है या बराबर है HONEYCOMB_MR1(Android: 2.1 API: 7) तो यह निष्पादक को बाध्य करता है THREAD_POOL_EXECUTOR(जो हनीकॉम्ब में क्रमिक रूप से कार्य चलाता है)।
यदि आपने परिभाषित नहीं किया है targetSdkVersionतो minSdkVersionस्वचालित रूप से माना जाता है targetSdkVersion
इसलिए अपने AsyncTask को पोस्ट Honeycomb पर समानांतर में चलाने के लिए आप targetSdkVersionखाली नहीं छोड़ सकते ।


1
बहुत अच्छा जवाब। जबकि मैथ्यू गलत नहीं है, मैं इसे स्वीकार कर रहा हूं, क्योंकि आप महत्वपूर्ण जानकारी का एक गुच्छा जोड़ते हैं।
सर्कु जूल

@ नाशे बहुत धन्यवाद। यह वास्तव में बहुत मददगार है। मैं 3 दिनों से इसी मुद्दे पर लड़ रहा था। धन्यवाद फिर से :)

मेरा दिन बचाया! काश यह उत्तर ढूंढना आसान होता।
zjk

4
अरे @ नशा, मेरी समस्या थोड़ी अजीब है। आज से पहले मैं AsyncTask पर .execute () पद्धति का उपयोग कर रहा था और कोड पूरी तरह से काम कर रहा था। लेकिन आज मुझे समस्या है - नियंत्रण doInBackground () विधि में नहीं जाता है। यद्यपि आप जो समाधान प्रदान कर रहे हैं वह काम कर रहा है, मैं हैरान हूं कि यह समाधान के बिना कैसे काम कर रहा था। मैं पहले और अब के उपकरणों का एक ही सेट उपयोग कर रहा हूं।
रवि सिसोदिया

ऐसा क्यों होना चाहिए? यह उम्मीदों के मुताबिक काम क्यों नहीं करता है? :(
निकोले आर

160

आपको इस उत्तर की जांच करनी चाहिए: https://stackoverflow.com/a/10406894/347565 और इसमें शामिल Google समूहों का लिंक।

मुझे आपके समान समस्या थी, फिर भी यह स्पष्ट नहीं है कि यह काम क्यों नहीं कर रहा है, लेकिन मैंने अपना कोड इस तरह बदल दिया और समस्या दूर हो गई:

ASyncTask<Void,Void,Void> my_task = new ASyncTask<Void,Void,Void>() { ... };
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
    my_task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Void[])null);
else
    my_task.execute((Void[])null);

इस पोस्ट को देखकर मुझे बहुत बुरा लगा है; मैं लंबे समय से परियोजना से दूर चला गया हूं। मैं इसका उत्तर सिर्फ इसलिए मानूंगा क्योंकि लोग कहते हैं कि यह काम करता है।
सेरुके डिस

यह मेरे लिए अभी काम किया है, लेकिन मुझे लगता है मैं क्यों समझा। यह पहले निष्पादित करने के साथ ठीक काम कर रहा था तब यह बंद हो गया। एक बात मैं कर रहा हूँ एक ही asynctask के onPostExecute (यानी मैं इसे पुनरावर्ती फोन कर रहा हूँ) के अंदर एक नया asynctask शुरू कर रहा है कि शायद समस्या से जुड़ा है?
चरणवती

मुझे लगता है कि यह आपको आपके लिए आवश्यक सभी स्पष्टीकरण देना चाहिए: commonsware.com/blog/2012/04/20/…
Matthieu

1
@ मैथ्यू: सर, मैं वास्तव में आपको पर्याप्त धन्यवाद नहीं दे सकता हूँ !!! मैं घंटों तक इस समस्या पर अपना सिर पीटता रहा और आपके समाधान ने सब कुछ एक आकर्षण की तरह काम कर दिया! शानदार जवाब के लिए बहुत बहुत धन्यवाद। काश मैं एक से अधिक उत्थान दे पाता !!
स्वयंवर


9

आप इसे दो तरीकों से कर सकते हैं:

रास्ता 1 :

if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB) // Above Api Level 13
  {
      asyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
  }
else // Below Api Level 13
  {
      asyncTask.execute();
  }

रास्ते के मामले में 1 आपके लिए काम नहीं करता है जिस तरह से 2

रास्ता 2 :

int mCorePoolSize = 60;
int mMaximumPoolSize = 80;
int mKeepAliveTime = 10;
BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<Runnable>(mMaximumPoolSize);
Executor mCustomThreadPoolExecutor = new ThreadPoolExecutor(mCorePoolSize, mMaximumPoolSize, mKeepAliveTime, TimeUnit.SECONDS, workQueue);
asyncTask.executeOnExecutor(mCustomThreadPoolExecutor);

आशा है कि यह आपकी मदद करेगा।


सुपर काम कर रहा है, लेकिन इसके बाद के Async कार्य जो AsyncTask.THREAD_POOL_EXECUTOR का उपयोग कर रहे हैं असफल हो रहे हैं, इसलिए मुझे पूरी परियोजना में CustomExecutor के साथ बदलने की आवश्यकता है मुझे लगता है :(
कुमार

@vinu, मैं आपको सुझाव देता हूं कि आप AsyncTask को अंजाम देने के लिए सामान्य एस्किंक टास्क और सामान्य विधि का उपयोग करें। आशा है कि यह आपकी मदद करेगा।
हिरेन पटेल

2
अरे इससे मुझे बहुत मदद मिली! धन्यवाद!
जस्टिन एब्बी

6

मेरे पास एक ही मुद्दा था: पहले एक पर "निष्पादित" कहे जाने के बाद मैं दूसरा एस्किंटस्कैस्क निष्पादित नहीं कर सकता: doInBackground को केवल पहले एक के लिए बुलाया जाता है।

ऐसा क्यों होता है इसका जवाब देने के लिए इस उत्तर की जांच करें (एसडीके के आधार पर अलग व्यवहार)

हालाँकि, आपके मामले के लिए, इस बाधा को निष्पादित करने वाले का उपयोग करके बचा जा सकता है। निष्पादनकर्ता (उपलब्ध 3.0 से शुरू होकर मेरे लिए 4.0.3 का उपयोग करके काम किया है) लेकिन थ्रेड पूल आकार और कतार की सीमाओं से सावधान रहें।

क्या आप कुछ इस तरह की कोशिश कर सकते हैं:

xmlAsync _xmlParseThread;
dbAsync _dbLookup;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

_dbLookup = new dbAsync();
_dbLookup.execute();

_xmlParseThread = new xmlAsync();       
_xmlParseThread.executeOnExecutor(_dbLookup.THREAD_POOL_EXECUTOR
 ,"http://www.nothing.com", null);
}

आपके अद्यतन प्रश्न के लिए: डॉक्स में यह समझाया गया है कि मूल रूप से सभी समस्याओं से बचने के लिए जो कि बहु-प्रसार से हो सकती हैं जैसे कि हस्तक्षेप।


5

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

यदि आप बैकग्राउंड थ्रेड से अपने AsyncTask का उदाहरण बना रहे हैं, या मुख्य UI थ्रेड पर कुछ अन्य ऑपरेशन नहीं हो रहे हैं, तो आप विधि का उपयोग करने पर विचार कर सकते हैं: Activity.runOnUiThread (Runnable)

आपको उस पद्धति को कॉल करने के लिए अपने रनिंग एक्टिविटी के एक उदाहरण तक पहुंच की आवश्यकता होगी, लेकिन यह आपको यूआई थ्रेड पर कुछ अन्य कोड से कोड चलाने की अनुमति देगा जो UI थ्रेड पर नहीं चल रहा है।

आशा है कि समझ में आता है। मुझे पता है कि क्या मैं और अधिक मदद कर सकता हूं।

डेविड


आपके जवाब में इस सूत्र को जोड़ने से एक दिलचस्प उत्तर है stackoverflow.com/questions/4080808/…
manjusg

शानदार उत्तर के लिए धन्यवाद! मैंने इसे इसलिए लिया क्योंकि मुझे लगता है कि यह एक सामान्य AsyncTask-Beginner समस्या हो सकती है। काश, यह इस मुद्दे के लिए सही जवाब नहीं है। दोनों वर्गों को मुख्य UI थ्रेड पर चल रहे एक गतिविधि के ऑनक्रिएट () में त्वरित किया जाता है। इस परियोजना में मेरी केवल एक गतिविधि है।
SeruK

@manjusg मैंने सभी के साथ विचार किया है कि यह कुछ करने के लिए था AsyncTask अस्थिर होने के साथ, शायद अतिरिक्त इतना जब कई एक साथ चलाए जाते हैं। यदि हां, तो क्यों?
SeruK

मुझे वास्तव में पता नहीं है कि एसओ के पास लगातार तीन बार तेजी से पोस्ट करने की क्या नीतियां हैं, लेकिन मैंने इसे दूसरे धागे में पाया ... foo.jasonhudgins.com/2010/05/limitation-of-asynctask.html "AsyncTask का उपयोग करता है 10 तत्वों की हार्ड-कोडित सीमा के साथ एक स्थिर आंतरिक कार्य कतार। " यह कुछ साबित हो सकता है, लेकिन मेरे पास AsyncTask-subclasses के दो उदाहरण हैं! मैं वास्तव में सामान्य थ्रेडिंग विधियों का उपयोग करने से बचना चाहूंगा क्योंकि अंततः अंततः बहुत कुछ किया जाएगा।
SeruK

2

Android क्रूर है! मैं इस पर विश्वास नहीं कर सकता, क्या परतदार कार्यान्वयन जो दिन से आज तक बदलता है। एक दिन इसका एक धागा, अगले 5 इसके दूसरे 128।

वैसे भी यहाँ स्टॉक AsyncTask के लिए प्रतिस्थापन में लगभग गिरावट है। आप चाहे तो इसे AsyncTask भी कह सकते हैं, लेकिन भ्रम की स्थिति से बचने के लिए इसके थ्रेडएडासंस्कटस्क पर कॉल करें। आपको निष्पादित करने के बजाय एग्ज़िकस्टार्ट () को कॉल करने की आवश्यकता है क्योंकि एग्ज़्यूट () अंतिम है।

/**
 * @author Kevin Kowalewski
 *
 */
public abstract class ThreadedAsyncTask<Params, Progress, Result> extends AsyncTask<Params, Progress, Result> { 
    public AsyncTask<Params, Progress, Result> executeStart(Params... params){
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){
            return executePostHoneycomb(params);
        }else{
            return super.execute(params);
        }
    }


    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    private AsyncTask<Params, Progress, Result> executePostHoneycomb(Params... params){
        return super.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params); 
    }
}

रुको, आप यह नहीं कह रहे हैं कि एंड्रॉइड के कुछ संस्करण आपके पास एक धागे पर एसिंक्स ऑप्स को प्रतिबंधित करते हैं? यह अविश्वसनीय रूप से मूर्खतापूर्ण होगा। (मैं थोड़ी देर के लिए एंड्रॉइड गेम से बाहर हो गया। :))
SeruK

हां, Android 3.0+ पर यदि आप AsyncTask.THREAD_POOL_EXECUTOR का उपयोग नहीं करते हैं तो आपको केवल एक का थ्रेड पूल मिलता है। अपने स्वयं के लिए प्रयास करें, दो AsyncTask की और बस किसी के doInBackground में सो जाओ। Android AsyncTask दस्तावेज़ीकरण से: "HONEYCOMB से शुरू होकर, समानांतर निष्पादन के कारण होने वाली सामान्य अनुप्रयोग त्रुटियों से बचने के लिए कार्यों को एक ही थ्रेड पर निष्पादित किया जाता है।"
केविन पार्कर

1

मुझे पता है कि यह वास्तव में थ्रेड के लिए देर हो सकती है, लेकिन एक कारण है कि यह बाद के एंड्रॉइड एमुलेटर पर काम नहीं करेगा। जब asynctask शुरू की गई थी, केवल एक समय में आपको एक ही चलाने दिया गया था, तो कुछ समय बाद, सुनिश्चित करें कि कौन सा संस्करण नहीं है, उन्होंने आपको एक ही बार में कई asynct मास्क चलाने की अनुमति दी है, इससे ऐप्स में बहुत से समस्याएँ हुईं, और इसलिए हनीकॉम्ब में वे केवल वापस आ गए। एक एसिंक्टस्क को एक बार में चलाने की अनुमति देता है। जब तक आप मैन्युअल रूप से थ्रेड पूल नहीं बदलते। आशा है कि लोगों के लिए एक या दो चीजें साफ करता है।


0

मुझे लगता है कि यह एसडीके है। मैं एक ही समस्या थी, और 15 से 11 को लक्ष्य एसडीके बदलने के बाद, सब कुछ पूरी तरह से काम करता है।

sdk15 के साथ, भले ही AsyncTask.Status RUNNING है, doInBackground कभी नहीं कहा जाता है। मुझे लगता है कि यह ui थ्रेड के साथ कुछ करना है, हालांकि।


मैं न तो इनकार कर सकता हूं और न ही पुष्टि कर सकता हूं क्योंकि मेरे पास अभी इसका परीक्षण करने का समय नहीं है। मैं केवल इतना कह सकता हूं कि मैं एसडीके 15 का उपयोग कर रहा था, इसलिए इसकी बहुत संभावना है।
सेरुके

0

अपने आवेदन में डुप्लिकेट कोड से बचने के लिए, एसडीके संस्करण के आधार पर अपने सही ढंग से निष्पादित करने के लिए एक सहायक वर्ग के नीचे, मैथ्यू के जवाब के आधार पर AsyncTask:

import android.annotation.SuppressLint;
import android.os.AsyncTask;
import android.os.Build;

public class AsyncTaskExecutor<Params, Progress, Result> {

  @SuppressLint("NewApi")
  public AsyncTask<Params, Progress, Result> execute(final AsyncTask<Params, Progress, Result> asyncTask, final Params... params){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){
      return asyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);
    }  else{
      return asyncTask.execute(params);
    }
  }

}

उपयोग का उदाहरण:

public class MyTask extends AsyncTask<Void, Void, List<String>> {

...

final MyTask myTask = new MyTask();
new AsyncTaskExecutor<Void, Void, List<String>>().execute(myTask);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.