A common requirement in any data driven Android app is the ability to download data asynchronously. This might be to lookup locations for a Google Maps view or to acquire dynamic app data. In order to do this you need to create a nested inner class that extends the AsyncTask class.

 

To do this is pretty simple:

class OuterClass {
    ...
    class InnerClass {
        ...
    }
}

Our inner class can now be accessed from within the outer class by calling:

InnerClass.myMethod()

In our case we want our inner class to extend the AsyncTask class so we start with:

class OuterClass {
    ...
    class InnerClass extends AsyncTask {
        ...
    }
}

Now there are also three sets of data which need types to be defined. These are:

  1. Parameters taken by the task
  2. Progress reporting data returned by the class
  3. Returned values from the task
To make the definitions you add types as:
class OuterClass {
    ...
    class InnerClass extends AsyncTask {
        ...
    }
}

There are also four methods that you need to know about:

  1. onPreExecute() – which is used to prepare the UI thread for the task.
  2. doInBackground(Params…) – which takes the parameters passed to the class and does the background task. E.g. downloads some data.
  3. onProgressUpdate(Progress…) – which tells the UI the percentage progress (integer out of 100).
  4. onPostExecute(Result) – which runs on the UI thread after the background task is complete.

So our class might look something like:

class OuterClass {
    ...
    class InnerClass extends AsyncTask {

    protected Long doInBackground(URL... urls) {

        int count = urls.length;
        long totalSize = 0;
        JSONObject[] jsondata; 

        for (int i = 0; i < count; i++) {

	    try {
		String data = getStringContent(urls[i]);
                jsondata[i] = new JSONObject(data)
                totalSize += Downloader.downloadFile(urls[i]);
                publishProgress((int) ((i / (float) count) * 100));
	    } catch (Exception e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	    }

        }

    return jsondata;

    }

    protected void onProgressUpdate(Integer... progress) {

        setProgressPercent(progress[0]);

    }

    protected void onPostExecute(JSONObject data) {

        // TODO process returned data eg:
        MyApplication.setJSONData(data);

    }
   }
}

There are a couple of funky Java things here worth explaining here. The … notation means an array of that type so URL… url means that an array of URL’s will be passed. Similarly the square brackets in the object declaration JSONObject[]… creates an array of JSONObject objects.

Lastly we want to be able to run this task and to do this we simply run:

new InnerClass().execute(url1, url2, url3);

Where url1 etc are the parameters all of type URL.

I hope this helps someone but for way more detail see http://developer.android.com/reference/android/os/AsyncTask.html