We often need to receive information from networks in Android apps. Although it is a simple process but the problem arises when it is done through the main user interaction thread. To understand this problem better consider using an app which shows some text downloaded from the online database. As the user clicks a button to display a text it may take some time to get the HTTP response. So what does an activity do in that time? It creates a lag in the user interface and makes the app to stop responding. Recently I implemented this in Connfa App to download data in Open Event Format.
To solve that problem we use concurrent thread to download the data and send the result back to be processed separating it from main user interaction thread. AsyncTask allows you to perform background operations and publish results on the UI thread without having to manipulate threads and/or handlers.
AsyncTask is designed to be a helper class around Thread and Handler and does not constitute a generic threading framework. AsyncTasks should ideally be used for short operations (a few seconds at the most). If you need to keep threads running for long periods of time, it is highly recommended you use the various APIs provided by the java.util.concurrent package such as Executor, ThreadPoolExecutor and FutureTask.
An asynchronous task is defined by a computation that runs on a background thread and whose result is published on the UI thread. An asynchronous task is defined by 3 generic types, called Params, Progress and Result, and 4 steps, called onPreExecute, doInBackground, onProgressUpdate and onPostExecute.
In this blog, I describe how to download data in an android app with AsyncTask using OkHttp library.
First, you need to add dependency for OkHttp Library,
compile 'com.squareup.okhttp:okhttp:2.4.0'
Extend AsyncTask class and implement all the functions in the class by overriding them to modify them accordingly. Here I declare a class named AsyncDownloader extending AsyncTask. We took the string parameter, integer type progress and string type result to return instead which will be our JSON data and param is our URL. Instead of using get the function of AsyncTask we implement an interface to receive data so the main user interaction thread does not have to wait for the return of the result.
public class AsyncDownloader extends AsyncTask<String, Integer, String> { private String jsonData = null; public interface JsonDataSetter { void setJsonData(String str); } JsonDataSetter jsonDataSetterListener; public AsyncDownloader(JsonDataSetter context) { this.jsonDataSetterListener = context; } @Override protected void onPreExecute() { super.onPreExecute(); } @Override protected String doInBackground(String... params) { String url = params[0]; OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url(url) .build(); Call call = client.newCall(request); Response response = null; try { response = call.execute(); if (response.isSuccessful()) { jsonData = response.body().string(); } else { jsonData = null; } } catch (IOException e) { e.printStackTrace(); } return jsonData; } @Override protected void onPostExecute(String jsonData) { super.onPostExecute(jsonData); jsonDataSetterListener.setJsonData(jsonData); } }
We download the data in doInBackground making a request using OkHttp library and send the result back in onPostExecute method using our interface method. See above to check out the complete class implementation.
You can make an instance to AsyncDownloader in an activity. Implement interface to receive that data.
Tip: Always close AsyncTask after using to avoid many concurrent tasks at one time.
Find the complete code here.
References:
- Google Android Developement Documentation – https://developer.android.com/reference/android/os/AsyncTask.html
- OkHttp library documentation – http://square.github.io/okhttp/