Android AsyncTask Example Tutorial

Filed Under: Android

Today we will look into Android AsyncTask. We will develop an Android example application that performs an abstract AsyncTask in background.

Android AsyncTask

Android AsyncTask is an abstract class provided by Android which gives us the liberty to perform heavy tasks in the background and keep the UI thread light thus making the application more responsive.

Android application runs on a single thread when launched. Due to this single thread model tasks that take longer time to fetch the response can make the application non-responsive. To avoid this we use android AsyncTask to perform the heavy tasks in background on a dedicated thread and passing the results back to the UI thread. Hence use of AsyncTask in android application keeps the UI thread responsive at all times.

The basic methods used in an android AsyncTask class are defined below :

  • doInBackground() : This method contains the code which needs to be executed in background. In this method we can send results multiple times to the UI thread by publishProgress() method. To notify that the background processing has been completed we just need to use the return statements
  • onPreExecute() : This method contains the code which is executed before the background processing starts
  • onPostExecute() : This method is called after doInBackground method completes processing. Result from doInBackground is passed to this method
  • onProgressUpdate() : This method receives progress updates from doInBackground method, which is published via publishProgress method, and this method can use this progress update to update the UI thread

The three generic types used in an android AsyncTask class are given below :

  • Params : The type of the parameters sent to the task upon execution
  • Progress : The type of the progress units published during the background computation
  • Result : The type of the result of the background computation

Android AsyncTask Example

To start an AsyncTask the following snippet must be present in the MainActivity class :


MyTask myTask = new MyTask();
myTask.execute();

In the above snippet we’ve used a sample classname that extends AsyncTask and execute method is used to start the background thread.

Note:

  • The AsyncTask instance must be created and invoked in the UI thread.
  • The methods overridden in the AsyncTask class should never be called. They’re called automatically
  • AsyncTask can be called only once. Executing it again will throw an exception

In this tutorial we’ll implement an AsyncTask that makes a process to go to sleep for a given period of time as set by the user.

Android Async Task Project Structure

android asynctask, android asynctask example

Android AsyncTask Example Code

The xml layout is defined in the activity_main.xml and its given below:

activity_main.xml


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/tv_time"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="10pt"
        android:textColor="#444444"
        android:layout_alignParentLeft="true"
        android:layout_marginRight="9dip"
        android:layout_marginTop="20dip"
        android:layout_marginLeft="10dip"
        android:text="Sleep time in Seconds:"/>
    <EditText
        android:id="@+id/in_time"
        android:layout_width="150dip"
        android:layout_height="wrap_content"
        android:background="@android:drawable/editbox_background"
        android:layout_toRightOf="@id/tv_time"
        android:layout_alignTop="@id/tv_time"
        android:inputType="number"
        />
    <Button
        android:id="@+id/btn_run"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Run Async task"
        android:layout_below="@+id/in_time"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="64dp" />
    <TextView
        android:id="@+id/tv_result"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="7pt"
        android:layout_below="@+id/btn_run"
        android:layout_centerHorizontal="true" />
</RelativeLayout>

In the above layout we’ve used a predefined drawable as the border of the EditText.

The MainActivity.java is defined below:


package com.journaldev.asynctask;

import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    private Button button;
    private EditText time;
    private TextView finalResult;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        time = (EditText) findViewById(R.id.in_time);
        button = (Button) findViewById(R.id.btn_run);
        finalResult = (TextView) findViewById(R.id.tv_result);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AsyncTaskRunner runner = new AsyncTaskRunner();
                String sleepTime = time.getText().toString();
                runner.execute(sleepTime);
            }
        });
    }

    private class AsyncTaskRunner extends AsyncTask<String, String, String> {

        private String resp;
        ProgressDialog progressDialog;

        @Override
        protected String doInBackground(String... params) {
            publishProgress("Sleeping..."); // Calls onProgressUpdate()
            try {
                int time = Integer.parseInt(params[0])*1000;

                Thread.sleep(time);
                resp = "Slept for " + params[0] + " seconds";
            } catch (InterruptedException e) {
                e.printStackTrace();
                resp = e.getMessage();
            } catch (Exception e) {
                e.printStackTrace();
                resp = e.getMessage();
            }
            return resp;
        }


        @Override
        protected void onPostExecute(String result) {
            // execution of result of Long time consuming operation
            progressDialog.dismiss();
            finalResult.setText(result);
        }


        @Override
        protected void onPreExecute() {
            progressDialog = ProgressDialog.show(MainActivity.this,
                    "ProgressDialog",
                    "Wait for "+time.getText().toString()+ " seconds");
        }


        @Override
        protected void onProgressUpdate(String... text) {
            finalResult.setText(text[0]);
            
        }
    }
}

In the above code we’ve used AsyncTaskRunner class to perform the AsyncTask operations. The time in seconds is passed as a parameter to the class and a ProgressDialog is displayed for the given amount of time.

The images given below are the outputs produced by the project where the time set by the user is 5 seconds.
android asynctask example, AsyncTask

This brings an end to the tutorial. You can download the final Android AsyncTask Project from the below link.

Comments

  1. jaypal says:

    java.io.IOException: Cannot run program “su”: error=13, Permission denied

    I got this error when I used your code for updating an android app from website stored apk.

  2. Rakshan Premsagar Kapikad says:

    Hi.

    Is there any possibility of returning an object from Async Task and using the attributes of that object in my main activity?

    Eg:

    I have an Async Task with parameters(void,void,Uaclient)
    {
    ..
    protected Uaclient doInBackground(){..return client}
    protected onPostExecute(Uaclient client){}
    }

    how to access this client in Mainactivity? I get a NullPointer error

  3. SAJAN.V says:

    Your stuffs are great.God bless u

  4. Faizan says:

    Hello ,Goodevening Your stuff is best it helps me a lot but i just have one doubt plz give me a solution for it

    i have done image slider exmaple using viewflipper the image slides properly but when i touch it it does not stops it stilss keep on sliding what should i implement so that whenever i long press the image should stop sliding n when i lift my finger it gets started again please help me though this please thankyou

  5. Raja says:

    By using Asynctask connect from one activity into another activity(intent) example in android..

  6. Abbos says:

    I have a question. I have created a project. I must that two asyntask methods need work at same time on the project. But I can not do with asyntask. What can you advise me? Thanks for the answer.

    1. Sapna says:

      I want to bind the sqlite DB with the frot end using AsyncTask can please help me do this?
      SQLite DB is created and stored in the local database and now i have to call to front end UI and display. This is offline project. and data from JSON is stored in SQLite.

      Thank You!

  7. athira says:

    Superb article… I was on my final year mini project, I was stuck when NetworkonMainThread Exception came. I searched google docs asynctask but it makes me more confused. But you did really great. For beginners like me, these type of blog posts is needed.

    1. Anupam says:

      Glad it helped you Athira.

  8. b0uda says:

    Hi , thx for the tutorial and i have a question please.
    how can we access the time variable witch is a local variable of the try catch block of the doInBackground function!!!!!

    1. Me says:

      Good question!

      What is the answer?

    2. Hossein says:

      Hi b0uda,

      Obviously the integer “time” variable of the “try block” belongs to
      that block and we can not use it outside of this block of code…but on “onPreExecute()”
      method : you can see “time” again…but this is “private EditText time” , declared at the
      beginning of the MainActivity ,NOT the “time” variable of the “try block” .

  9. shivaji says:

    Very nice explanation . Great article !! thanks

  10. shihab says:

    Woow..Cool article..This article removed all of my confusion about AsyncTask..
    Thank you very much..

    1. gopinath says:

      really nice

  11. krishna kulat says:

    public String sendPostRequest(String requestURL,
    HashMap postDataParams) {

    URL url;

    StringBuilder sb = new StringBuilder();
    try {
    url = new URL(requestURL);

    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    conn.setReadTimeout(15000);
    conn.setConnectTimeout(15000);
    conn.setRequestMethod(“POST”);
    conn.setDoInput(true);
    conn.setDoOutput(true);

    OutputStream os = conn.getOutputStream();
    BufferedWriter writer = new BufferedWriter(
    new OutputStreamWriter(os, “UTF-8”));
    writer.write(getPostDataString(postDataParams));

    writer.flush();
    writer.close();
    os.close();
    int responseCode = conn.getResponseCode();

    if (responseCode == HttpsURLConnection.HTTP_OK) {
    BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
    sb = new StringBuilder();
    String response;
    while ((response = br.readLine()) != null){
    sb.append(response);
    }
    }

    } catch (Exception e) {
    e.printStackTrace();
    }
    return sb.toString();
    }

    private String getPostDataString(HashMap params) throws UnsupportedEncodingException {
    StringBuilder result = new StringBuilder();
    boolean first = true;
    for (Map.Entry entry : params.entrySet()) {
    if (first)
    first = false;
    else
    result.append(“&”);

    result.append(URLEncoder.encode(entry.getKey(), “UTF-8”));
    result.append(“=”);
    result.append(URLEncoder.encode(entry.getValue(), “UTF-8”));
    }

    return result.toString();
    }

  12. Tim Verdouw says:

    Thanks, that was so easy to implement and wow the app runs so much faster now. Thanks so much for your time to make this tutorial. Really appreciated.

  13. Champak says:

    Great explanation
    Another beautiful implementation of Async Task is creating animations like in this app
    https://play.google.com/store/apps/details?id=developer.android.vd.diceroller

  14. Manish says:

    Hello,
    I am trying to replace pageradapter activity with AsyncTask IS IT POSSIBLE WITH YOUR TUTORIAL?

  15. Android quiz says:

    Thanks for you great tutorials

    I have one question

    Is it good for using AsyncTask to download a file with the size up to 100MB?

  16. Ami charadava says:

    Good Explaination.

  17. Mr Khanh says:

    your post is very good. thank you for sharing.

  18. Samir says:

    Thanks very usefulll

  19. Abhishek Purohit says:

    Dear Sir,
    I have an unique problem. In my app I need to refresh displayed data almost every second, the data are stored on a SQL Server hosted on a web hosting provider, Now I’ve completed development and the results are promising just one big problem. I’m using Timer to run queries: like this
    @Override
    protected void onResume() {
    super.onResume();
    //onResume we start our timer so it can start when the app comes from the background
    startTimer();
    }
    @Override
    protected void onStop() {
    super.onStop();
    stopTimerTask();
    }
    public void startTimer() {
    //set a new Timer
    timer = new Timer();

    //initialize the TimerTask’s job
    initializeTimerTask();

    //schedule the timer,
    timer.schedule(timerTask, 0, 1500); //
    }
    public void stopTimerTask() {
    //stop the timer, if it’s not already null
    if (timer != null) {
    timer.cancel();
    timer = null;
    }
    }
    public void initializeTimerTask() {
    timerTask = new TimerTask() {
    public void run() {
    //use a handler to run a toast that shows the current timestamp
    handler.post(new Runnable() {
    public void run() {
    populateList(); //runs queries to the sql server and updates appropriate textviews

    }
    });
    }
    };
    }

    Now this approach is working if I just watch the data, If I want to interact with the ui it freezes and slows down. In your example of AsyncTask you’ve mentioned working off UI thread can this solve my problem a simple code example will save my life. Please help if you can.
    Thanks

    1. abhishek says:

      Abhishek, you are not suppose to fetch the data from server using main thread. coz that will crash your app. You must need to use asyntask to fetch data.

  20. jorge says:

    thanks great work

  21. Kayun Chan says:

    Thank you for such a great tutorial. It is clear and understandable.

Leave a Reply

Your email address will not be published. Required fields are marked *

close
Generic selectors
Exact matches only
Search in title
Search in content
Search in posts
Search in pages