Search code examples
androidandroid-asynctask

Android AsyncTask example and explanation


I want to use an AsyncTask in my app, but I am having trouble finding a code snippet with a simple explanation of how things work. I just want something to help me get back up to speed quickly without having to wade through the documentation or lots of Q&As again.


Solution

  • AsyncTask is one of the easiest ways to implement parallelism in Android without having to deal with more complex methods like Threads. Though it offers a basic level of parallelism with the UI thread, it should not be used for longer operations (of, say, not more than 2 seconds).

    AsyncTask has four methods

    • onPreExecute()
    • doInBackground()
    • onProgressUpdate()
    • onPostExecute()

    where doInBackground() is the most important as it is where background computations are performed.

    Code:

    Here is a skeletal code outline with explanations:

    public class AsyncTaskTestActivity extends Activity {
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);  
    
            // This starts the AsyncTask
            // Doesn't need to be in onCreate()
            new MyTask().execute("my string parameter");
        }
    
        // Here is the AsyncTask class:
        //
        // AsyncTask<Params, Progress, Result>.
        //    Params – the type (Object/primitive) you pass to the AsyncTask from .execute() 
        //    Progress – the type that gets passed to onProgressUpdate()
        //    Result – the type returns from doInBackground()
        // Any of them can be String, Integer, Void, etc. 
    
        private class MyTask extends AsyncTask<String, Integer, String> {
    
            // Runs in UI before background thread is called
            @Override
            protected void onPreExecute() {
                super.onPreExecute();
    
                // Do something like display a progress bar
            }
    
            // This is run in a background thread
            @Override
            protected String doInBackground(String... params) {
                // get the string from params, which is an array
                String myString = params[0];
    
                // Do something that takes a long time, for example:
                for (int i = 0; i <= 100; i++) {
    
                    // Do things
    
                    // Call this to update your progress
                    publishProgress(i);
                }
    
                return "this string is passed to onPostExecute";
            }
    
            // This is called from background thread but runs in UI
            @Override
            protected void onProgressUpdate(Integer... values) {
                super.onProgressUpdate(values);
    
                // Do things like update the progress bar
            }
    
            // This runs in UI when background thread finishes
            @Override
            protected void onPostExecute(String result) {
                super.onPostExecute(result);
    
                // Do things like hide the progress bar or change a TextView
            }
        }
    }
    

    Flow Diagram:

    Here is a diagram to help explain where all the parameters and types are going:

    enter image description here

    Other helpful links: