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 :
1 2 3 4 |
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 Example Code
The xml layout is defined in the activity_main.xml and its given below:
activity_main.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android" xmlns:tools="https://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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
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.
This brings an end to the tutorial. You can download the final Android AsyncTask Project from the below link.