13

E.g .: आप कुछ ऐसा करने वाले हैं जो कुछ सेकंड लेगा और अपने यूआई थ्रेड को फ्रीज नहीं करना चाहता, है ना? आप एक AsyncTask का उपयोग कर सकते हैं लेकिन आप एक छोटी फ्रीज समस्या को हल करने के लिए बाहरी (या आंतरिक) वर्ग बनाना नहीं चाहते हैं।क्या एक अच्छा अभ्यास समानांतर छोटे ज्ञात फ्रीज प्रक्रिया के लिए अनाम AsyncTask बनाता है?

तो, क्या यह एक अच्छा प्रेटिस है?

package com.example.stackoverflowsandbox; 

import android.os.AsyncTask; 

public class Foo { 
    // E.g. before call foo method you change you Activity to loading state. 
    private void foo() { 
     new AsyncTask<Void, Void, Void>() { 
      @Override 
      protected Void doInBackground(final Void ... params) { 
       // something you know that will take a few seconds 

       return null; 
      } 

      @Override 
      protected void onPostExecute(final Void result) { 
       // continue what you are doing... 

       Foo.this.continueSomething(); 
      } 
     }.execute(); 
    } 

    private void continueSomething() { 
     // some code... 
    } 
} 

मैं जब मैं बिटमैप कंप्रेस आइटम के अंदर कुछ डेटा अद्यतन करने के लिए बड़ा सरणी पाशन कि के साथ सामना किया है।

+3

मैं देख रहा हूँ कि यह कैसे बचाता है न:

new AsyncTask<Void, Void, Void>() { .... .... }.execute(); <------ serial execution 


बजाय एक थ्रेड पूल निष्पादक का उपयोग किसी भी काम को बनाम एक आंतरिक वर्ग बनाते हुए, बस बहुत गन्दा आईएमओ – tyczj

+1

लगता है यह निर्भर करता है ... केवल थाई एनजी क्या हो सकता है कि पृष्ठभूमि में गतिविधि डालने के बाद थ्रेड (AsyncTask) चल रहा है या नष्ट हो गया है। लेकिन आम तौर पर यह भयानक है, क्योंकि गुमनाम वर्ग को कोड में कहीं उधार लिया जाता है। –

+2

केवल पठनीयता के प्रश्न के लिए, याद रखें कि अज्ञात आंतरिक वर्ग से उत्पन्न वस्तुओं को 'OuterClass $ 2' के नोटेशन के साथ बुलाया जाता है, और यदि आप आंतरिक कक्षा घोंसला शुरू करते हैं, तो डीबगजिन मुश्किल हो सकता है – Blackbelt

उत्तर

24

हां, लेकिन जिस तरह से आप इसे नहीं करते हैं।

याद रखें कि हनीकोम्ब शुरू करने AsyncTasks के डिफ़ॉल्ट निष्पादन मॉडल है धारावाहिक:

new AsyncTask<Void, Void, Void>() { 
     .... 
     .... 
    }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null); <------ parallel execution 
+0

धन्यवाद लेकिन मेरा मतलब है कि अगर ऐसा एक अच्छा अभ्यास कोड है। =] –

+0

यदि 'इस तरह' से आप अज्ञात एसिंक्टास्क का तात्कालिकता का मतलब है तो उत्तर हाँ है। कोड निष्पादन के मामले में कोई समस्या नहीं है और यहां तक ​​कि एक प्रारंभिक एंड्रॉइड डेवलपर भी पता चलेगा कि आपका क्या मतलब है –

+5

वर्गीकरण: निष्पादित() निष्पादित रूप से केवल अन्य AsyncTasks के संबंध में कार्य करता है। यह एक एकल पृष्ठभूमि धागा है जो उन्हें चलाता है, लेकिन यह अभी भी कॉलर के समानांतर wrt है। – Debriter

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