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:
- Parameters taken by the task
- Progress reporting data returned by the class
- Returned values from the task
class OuterClass {
...
class InnerClass extends AsyncTask {
...
}
}
There are also four methods that you need to know about:
- onPreExecute() - which is used to prepare the UI thread for the task.
- doInBackground(Params...) - which takes the parameters passed to the class and does the background task. E.g. downloads some data.
- onProgressUpdate(Progress...) - which tells the UI the percentage progress (integer out of 100).
- 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
