Over a million developers have joined DZone.

Example of a Generic HTTP Asynchronous Task in Android

·

While developing an Android app to interact with RESTful APIs over the HTTP connection, i thought to create a generic Asynchronous HTTP task. The asynchronous task in Android (or for general) is a task which is usually done in a background thread (other than the UI thread) and is executed Asynchronously.

Below is the code snippet for the Android Asynctask for this generic class.
import android.content.Context;
import android.os.AsyncTask;
import android.util.Log;
import org.json.JSONObject;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;

public class HTTPAsyncTask extends AsyncTask<String, Void, String> {
  private CallBack mCb;
  LinkedHashMap<Object, Object> mData = null;
  //List mParams= new ArrayList();
  LinkedHashMap<Object, Object> mParams = new LinkedHashMap<>();
  String mTypeOfRequest;
  String mStrToBeAppended = "?";
  boolean isPostDataInJSONFormat = false;
  JSONObject mJSONPostData = null;
  Context mContext = null;
 
  public HTTPAsyncTask(Context context, CallBack c, HashMap<Object, Object> data, JSONObject jsonObj, String request) {
     mContext = context;
     mCb = c;
     mTypeOfRequest = request;
     mJSONPostData = jsonObj;
     //Log.i("JSONDATA", mJSONPostData.toString());
     if((data != null) && (jsonObj == null)){
     mData = (LinkedHashMap)data;


//GET
     if(mTypeOfRequest.equalsIgnoreCase("GET")){
        Object key = null;
        Iterator<Object> it = mData.keySet().iterator();
        while(it.hasNext()){
           key = it.next();
           mParams.put(key, mData.get(key));
           Log.d("Data", key.toString() + " " + mData.get(key).toString());
           }
        Iterator<Object>itParams = mParams.keySet().iterator();
        int sizeOfParams = mParams.size();
        int index = 0;
        while(itParams.hasNext()){
           Object keyParams = itParams.next();
           index++;
           if (index == sizeOfParams){
              mStrToBeAppended+=  keyParams + "=" + mParams.get(keyParams);
              break;
           }
           mStrToBeAppended+=  keyParams + "=" + mParams.get(keyParams)+ "&";


        }
     }


//POST
     if(mTypeOfRequest.equalsIgnoreCase("POST")){
        Object key = null;
        isPostDataInJSONFormat = false;
        Iterator<Object> it = mData.keySet().iterator();
        while(it.hasNext()){
           key = it.next();
           mParams.put(key, mData.get(key));
           }
        }
     }
    
//POST with Data in jSON format
     if ((mData == null) && (mJSONPostData != null) && (mTypeOfRequest.equalsIgnoreCase("POST") == true)){
        isPostDataInJSONFormat = true;
        }
  }
 
  @Override
  protected String doInBackground(String... baseUrls) {
  //android.os.Debug.waitForDebugger();
     publishProgress(null);
     if(mTypeOfRequest.equalsIgnoreCase("GET")){
     String finalURL = baseUrls[0]+ mStrToBeAppended;
     return HttpUtility.GET(finalURL);
     }
    
     if (mTypeOfRequest.equalsIgnoreCase("POST")){
        if(isPostDataInJSONFormat == false){
           return HttpUtility.POST(baseUrls[0],mParams );
        }
        if(isPostDataInJSONFormat == true){
           Log.i("JSONDATAPOSTMETHOd","JSON POST method to be called...");
           return HttpUtility.POST(baseUrls[0], mJSONPostData);
        }
     }
     return null;
  }
 
  // onPostExecute displays the results of the AsyncTask.
  @Override
  protected void onPostExecute(String result) {
     mCb.onResult(result);
  }
 
  @Override
  protected void onProgressUpdate(Void...voids ) {
  mCb.onProgress();
  }
}

As you can see, that the doInBackground function of this class actually takes the help from an Utility class called HttpUtility. Below is the code for this class.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicHeader;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpParams;
import org.apache.http.protocol.HTTP;
import org.json.JSONObject;

import android.util.Log;

public class HttpUtility {

private final static HttpClient mHhttpclient = new DefaultHttpClient();

public static String GET(String url){
        InputStream inputStream = null;
        String result = "";
        try {

            // create HttpClient
            //HttpClient httpclient = new DefaultHttpClient();

            // make GET request to the given URL
            HttpResponse httpResponse = mHhttpclient.execute(new HttpGet(url));

            // receive response as inputStream
            inputStream = httpResponse.getEntity().getContent();

            // convert inputstream to string
            if(inputStream != null){
            result = convertInputStreamToString(inputStream);
            //inputStream.close();
            }

            else
                result = "Did not work!";

        } catch (Exception e) {
            Log.d("InputStream", e.getLocalizedMessage());
        }

        return result;
    }

public static String POST(String url, HashMap<Object, Object> mParams){
InputStream inputStream = null;
        String result = "";
try{
//HttpClient httpclient = new DefaultHttpClient();
        HttpPost post = new HttpPost(url);
        post.setEntity(new UrlEncodedFormEntity((List<? extends NameValuePair>) mParams, "UTF-8"));
        HttpResponse httpResponse = mHhttpclient.execute(post);

     // receive response as inputStream
            inputStream = httpResponse.getEntity().getContent();

            // convert inputstream to string
            if(inputStream != null){
            result = convertInputStreamToString(inputStream);
            //inputStream.close();
            }

            else
                result = "Did not work!";

        } catch (Exception e) {
            Log.d("InputStream", e.getLocalizedMessage());
        }

        return result;


}
public static String POST(String url, JSONObject obj){

Log.i("JSONPOSTBEGIN", "Beginning of JSON POST");
InputStream inputStream = null;
        String result = "";

    //HttpClient httpclient = new DefaultHttpClient();

    try{
    HttpPost post = new HttpPost(url);
    post.setHeader("Content-type", "application/json");
    post.setHeader("Accept", "application/json");

    StringEntity se = new StringEntity(obj.toString());
    //se.setContentType("application/json;charset=UTF-8");
        se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
        post.setEntity(se);

        HttpResponse httpResponse = mHhttpclient.execute(post);

        // receive response as inputStream
            inputStream = httpResponse.getEntity().getContent();

            // convert inputstream to string
            if(inputStream != null){
            result = convertInputStreamToString(inputStream);
            }

            else
                result = "Did not work!";

        } catch (Exception e) {
            Log.d("InputStream", e.getLocalizedMessage());
        }
    Log.i("JSONPOSTEND", "End of JSON data post methos...");
    return result;
}

public static String convertInputStreamToString(InputStream inputStream) throws IOException{
        BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(inputStream));
        String line = "";
        String result = "";
        while((line = bufferedReader.readLine()) != null)
            result += line;

        inputStream.close();
        return result;

    }
}

I have created a callback interface to notify the UI the progress of the background task. This Callback interface has to be implemented by the Activity which wants to call the HttpAsynctask. The callback interface is simple and it looks like the following.

public interface CallBack {
public void onProgress();
public void onResult(String result);
public void onCancel();
}

The callback is to be implemented by the Activity as the following.

final CallBack callback = new CallBack(){
@Override
public void onProgress() {
// TODO Auto-generated method stub
mProgressDialog.show();

}

@Override
public void onResult(String result) {
// TODO Auto-generated method stub
Log.i("Signup Activity", result);
mProgressDialog.dismiss();
......
......
//Do the other stuff here
}

@Override
public void onCancel() {
// TODO Auto-generated method stub

}

And the way this Asynctask is called from the Activity is as follwos. (I have shown only the JSON Post call)

String url= "Your URL";
JSONObject postData = new JSONObject();
postData.put(Key1, Data1);
postData.put(Key2, Data2); 
HTTPAsyncTask asyncTask = new AsyncTask(mContext,callback, null, postData, "POST"); 
asyncTask.execute(url); 


Topics:
android ,asynctask

Opinions expressed by DZone contributors are their own.

The best of DZone straight to your inbox.

SEE AN EXAMPLE
Please provide a valid email address.

Thanks for subscribing!

Awesome! Check your inbox to verify your email so you can start receiving the latest in tech news and resources.
Subscribe

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}