android-asynctaskAndroid-asynctask के साथ आरंभ करना


टिप्पणियों

यह खंड Android-asynctask क्या है का एक सिंहावलोकन प्रदान करता है, और क्यों एक डेवलपर इसका उपयोग करना चाह सकता है।

इसमें एंड्रॉइड-एसिंक्टस्क के भीतर किसी भी बड़े विषयों का भी उल्लेख होना चाहिए, और संबंधित विषयों को लिंक करना चाहिए। चूंकि android-asynctask के लिए दस्तावेज़ीकरण नया है, इसलिए आपको उन संबंधित विषयों के प्रारंभिक संस्करण बनाने की आवश्यकता हो सकती है।

अवधारणा से कार्यान्वयन तक AsyncTask

संकल्पना

AsyncTask एक ऐसा वर्ग है जो पृष्ठभूमि में संचालन चलाने की अनुमति देता है, जिसके परिणाम UI थ्रेड पर प्रकाशित किए जाते हैं। मुख्य उद्देश्य हैंडलर को समाप्त करने और थ्रेड में हेरफेर करने के लिए आवश्यक सभी सामान को शुरू करने / चलाने के लिए सभी बॉयलरप्लेट कोड को समाप्त करना है। इसके अलावा, AsyncTask का उद्देश्य पृष्ठभूमि थ्रेड (कम से कम कुछ सेकंड) पर कम-समय का संचालन करना है, लंबे समय तक संचालन नहीं। इसलिए, यह महत्वपूर्ण है कि AsyncTask को जेनेरिक थ्रेडिंग फ्रेमवर्क के साथ भ्रमित न किया जाए। यदि किसी को लंबे समय तक संचालन करने की आवश्यकता है, तो समवर्ती पैकेज की सिफारिश की जाती है।

सामान्य विचार

AsyncTask को तीन सामान्य प्रकारों द्वारा परिभाषित किया गया है: परमेस, प्रगति और परिणाम। जिस क्षण से इसे निष्पादित किया जाता है, यह 4 चरणों (विधियों) से गुजरता है। पहले onPreExecute है , जहां कोई लोडिंग संवाद, या कुछ यूआई संदेश को परिभाषित कर सकता है जो उपयोगकर्ता को सूचित कर सकता है कि निष्पादन शुरू होने वाला है। अगला, doInBackground वह विधि है जो Ui थ्रेड से भिन्न थ्रेड पर एसिंक्रोनस रूप से चलाई जाती है। तीसरी विधि onProgressUpdate है जो UI थ्रेड पर भी चल सकती है जो उपयोगकर्ता को स्थिति के बारे में सूचित कर सकती है। अंतिम विधि इसे ऑनपोस्ट एक्स्यूट्यूट कहा जाता है इसका उपयोग मुख्य रूप से परिणाम प्रकाशित करने के लिए किया जाता है।

नीचे एक स्ट्रिंग को वापस करने के लिए एक AsyncTask का उपयोग करने के तरीके पर एक उदाहरण दिया गया है।
उदाहरण 1

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button = (FloatingActionButton) findViewById(R.id.btn);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                executeAsyncTaskOperation();
            }
        });
    }


      private void executeAsyncTaskOperation() {
        new CustomAsyncTask(this).execute();
    }

    private static class CustomAsyncTask extends AsyncTask<Void, Void, String> {

        private Context context;
        private ProgressDialog progressDialog;

        public CustomAsyncTask(Context context) {
            this.context = context;
        }

        @Override
        protected void onPreExecute() {
            progressDialog = ProgressDialog.show(context, "Please wait...", "Loading data from web");
        }

        @Override
        protected String doInBackground(Void... params) {
            String object = null;
            try {
                Log.d(CustomAsyncTask.class.getCanonicalName(), "doInBackground");
                Thread.sleep(500);
                //bject = "new object";
            } catch (Exception exc) {
                Log.e(CustomAsyncTask.class.getCanonicalName(), "exception");
                object = null;
            }
            return object;
        }

        @Override
        protected void onPostExecute(String s) {
            if (progressDialog != null && progressDialog.isShowing()) {
                progressDialog.dismiss();
            }
            if (s != null) {
                Toast.makeText(context, "finished successfully!", Toast.LENGTH_LONG).show();
            } else {
                Toast.makeText(context, "finished unsuccessfully!", Toast.LENGTH_LONG).show();

            }
        }
    }
}
 

उदाहरण 2

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

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();

                executeAsyncTaskOperation();
            }
        });
    }


    private void executeAsyncTaskOperation() {
        Boolean[] bools = new Boolean[10];
        for (int k = 0; k < 10; k++) {
            if (k % 2 == 0) {
                bools[k] = true;
            } else {
                bools[k] = false;
            }
        }
        new CustomAsyncTask(this).execute(bools);
    }

    private static class CustomAsyncTask extends AsyncTask<Boolean, Void, Integer> {

        private Context context;
        private ProgressDialog progressDialog;

        public CustomAsyncTask(Context context) {
            this.context = context;
        }

        @Override
        protected void onPreExecute() {
            progressDialog = ProgressDialog.show(context, "Please wait...", "Loading data from web");
        }

        @Override
        protected Integer doInBackground(Boolean... params) {
            int count = 0;
            try {
                Thread.sleep(1000);
                Log.d(CustomAsyncTask.class.getCanonicalName(), "doInBackground");
                for (Boolean param : params) {
                    if (param) {
                        count++;
                    }
                }
            } catch (Exception exc) {
                Log.e(CustomAsyncTask.class.getCanonicalName(), "exception");
                count = 0;
            }
            return count;
        }

        @Override
        protected void onPostExecute(Integer s) {
            if (progressDialog != null && progressDialog.isShowing()) {
                progressDialog.dismiss();
            }
            if (s != null && s > 0) {
                Toast.makeText(context, "finished loading: " + s + " tasks", Toast.LENGTH_LONG).show();
            } else {
                Toast.makeText(context, "finished unsuccessfully!", Toast.LENGTH_LONG).show();

            }
        }
    }
}