Today we will look into Android AsyncTask. We will develop an Android example application that performs an abstract AsyncTask in background.
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 :
The three generic types used in an android AsyncTask class are given below :
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:
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.
The xml layout is defined in the activity_main.xml and its given below: activity_main.xml
<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:
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.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
While we believe that this content benefits our community, we have not yet thoroughly reviewed it. If you have any suggestions for improvements, please let us know by clicking the “report an issue“ button at the bottom of the tutorial.
Please sir how can I use Async Task to display an image or a progress bar while another activity loads?
- Chibuzor Olumor
i have problem : i have a class MainActivity and i create an other class (public class MySql extends AsyncTask) i have return boolean value and now i want get this value , so how ???
- sirine
Very helpful to understand and implement AsyncTask abstract class as a Helper class.
- Umair
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.
- jaypal
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
- Rakshan Premsagar Kapikad
Your stuffs are great.God bless u
- SAJAN.V
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
- Faizan
By using Asynctask connect from one activity into another activity(intent) example in android…
- Raja
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.
- Abbos
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.
- athira