AsyncTask is a way to easily perform asynchronous tasks. Extremely useful when updating the UI. In fact, you cannot simply write a For Loop in your base Android code and have it update the UI per each iteration. It will only update the UI at the end.
My example is simple: take an imageView that has been defined in the main.xml file and update the image that it contains every 500ms after pressing a button.
For this example I assume you have already created the basic structure of your program with an imageView, a button, your images and the structure to allow you to click the button and perform an action.
Call the AsyncTask
This code should go where you are calling your button
// Define the # of iterations to change the image
Integer runLength = new Integer(4);
// Link to your imageView in your GUI
imageview1 = (ImageView)findViewById(R.id.imageView1);
// Call the AsyncTask
new ChangeGuiImages2().execute(runLength);
Execute the AsyncTask This code should go in the same function as the rest of your code (for my example it was directly after the onCreate function)
private class ChangeGuiImages2 extends
AsyncTask <integer, boolean integer> {
// This function performs the task (does not update the UI)
@Override
protected Boolean doInBackground(Integer... runLength){
// Make a copy of the runLength Integer
int l_runLength = runLength[0].intValue();
// Run you loop to update the imageView
for (int i=0; i < l_runLength; i++){
// Log what the function is doing
Log.d(TAG,"doInBackround"+i);
// Call the progress function, pass the current loop iteration
Integer progress = new Integer(i);
publishProgress(progress);
// Sleep for 500ms
SystemClock.sleep(500);
}
return null;
}
// This function is used to send progress back
// to the UI during doInBackground
@Override
protected void onProgressUpdate(Integer...integers){
// Log what the functions is doing
Log.d(TAG,"onProgressUpdate:"+integers[0]);
// Create a local copy of the integer
int l_integers = integers[0].intValue();
// Set the imageview to the appropriate image based on iteration.
// (sample_0, sample_1, ... etc.)
imageview1.setImageResource(getResources().getIdentifier(
"sample_"+l_integers, "drawable", getPackageName()));
}
// This function is called when doInBackground is done
@Override
protected void onPostExecute(Boolean b){
// Log what the functions is doing
Log.d(TAG,"onPostExecute");
}
}
