Skip to content

Instantly share code, notes, and snippets.

@JanithaR
Last active April 10, 2018 20:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save JanithaR/ff97f074c18b3eea0e0b to your computer and use it in GitHub Desktop.
Save JanithaR/ff97f074c18b3eea0e0b to your computer and use it in GitHub Desktop.
// GetJSONGET - this is the class that does the JSON downloading
package com.domain.project.net;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.HttpGet;
import org.json.JSONArray;
import org.json.JSONException;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.TrafficStats;
import android.net.http.AndroidHttpClient;
import android.os.AsyncTask;
import com.domain.project.debug.ELog;
import com.domain.project.interfaces.GetJSONListener;
/**
* @author Janitha
*
*/
public class GetJSONGET extends AsyncTask<HttpGet, Void, JSONArray> {
private ProgressDialog _progressDialog;
private Context _context;
private Boolean _showProgressDialog;
private Boolean _devMode = false;
private double _tx;
private double _rx;
public GetJSONGET(Context context, Boolean showProgressDialog, String message, Boolean cancelable, Boolean devMode) {
_context = context;
_showProgressDialog = showProgressDialog;
_devMode = devMode;
_progressDialog = new ProgressDialog(_context);
_progressDialog.setMessage(message);
_progressDialog.setIndeterminate(true);
if (cancelable) {
_progressDialog.setCancelable(true);
_progressDialog.setOnCancelListener(new OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
cancel(true);
final Activity activity = (Activity) _context;
activity.finish();
}
});
}
if (_devMode) {
_tx = TrafficStats.getTotalTxBytes();
_rx = TrafficStats.getTotalRxBytes();
}
}
@Override
protected JSONArray doInBackground(HttpGet... params) {
return downloadAndParseJSON(params[0]);
}
@Override
protected void onPreExecute() {
if (_showProgressDialog) {
_progressDialog.show();
}
}
@Override
protected void onPostExecute(JSONArray result) {
if (_devMode) {
double tx = TrafficStats.getTotalTxBytes();
double rx = TrafficStats.getTotalRxBytes();
ELog.d(getClass().getName(), Double.toString(Math.round((tx - _tx) / 1024)) + "kb Tx, " + Double.toString(Math.round((rx - _rx) / 1024)) + "kb Rx");
}
if (_showProgressDialog) {
_progressDialog.dismiss();
}
if (result == null) {
if (_devMode)
ELog.w(getClass().getName(), "Nothing was retrieved");
}
try {
((GetJSONListener) _context).onGetJSONComplete(result);
} catch (Exception e) {
ELog.e(getClass().getName(), "Is GetJSONListener implemented by the calling class?");
}
}
@Override
protected void onCancelled() {
if (_devMode)
ELog.i(getClass().getName(), "Loading cancelled!");
_progressDialog.dismiss();
}
private JSONArray downloadAndParseJSON(HttpGet httpGet) {
final long start = System.currentTimeMillis();
final Boolean isOnline = checkInternet();
if (!isOnline) {
// Caused by: java.lang.RuntimeException: Can't create handler
// inside thread that has not called Looper.prepare()
// Toast.makeText(_context, "Network connectivity unavailable",
// Toast.LENGTH_LONG).show();
return null;
}
else {
final AndroidHttpClient client = AndroidHttpClient.newInstance("Android");
try {
if (_devMode)
ELog.i(getClass().getName(), "Downloading JSON from " + httpGet.getURI());
// check whether the calling activity of this has set this's
// status to cancelled
if (isCancelled()) {
return null;
}
final HttpResponse response = client.execute(httpGet);
final int statusCode = response.getStatusLine().getStatusCode();
// check whether the calling activity of this has set this's
// status to cancelled
if (isCancelled()) {
return null;
}
if (statusCode != HttpStatus.SC_OK) {
if (_devMode)
ELog.w(getClass().getName(), "Error " + statusCode + " while downloading " + httpGet.getURI());
return null;
}
final HttpEntity entity = response.getEntity();
if (entity != null) {
final InputStream inputStream = entity.getContent();
final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "utf-8"), 8);
final StringBuilder builder = new StringBuilder();
String line;
while ((line = bufferedReader.readLine()) != null) {
builder.append(line + "\n");
}
line = builder.toString();
line = line.trim();
final Character character = line.charAt(0);
if (isAJSONArray(character) == false) {
if (_devMode)
ELog.i(getClass().getName(), "Data sent as a JSONObject. Converting to a JSONArray");
line = "[" + line + "]";
}
if (inputStream != null) {
inputStream.close();
}
entity.consumeContent();
if (_devMode)
ELog.i(getClass().getName(), "Downloading JSON from " + httpGet.getURI() + " successful");
final long duration = System.currentTimeMillis() - start;
if (_devMode)
ELog.d(getClass().getName(), "Execution time = " + duration + "ms");
return new JSONArray(line);
}
}
catch (JSONException e) {
if (_devMode)
ELog.w(getClass().getName(), "Error parsing JSON." + e.toString());
}
catch (IOException e) {
if (httpGet.isAborted()) {
return null;
}
else {
if (_devMode)
ELog.w(getClass().getName(), "I/O Error while downloading " + httpGet.getURI());
}
}
catch (Exception e) {
if (_devMode)
ELog.w(getClass().getName(), "Error -> " + e.toString());
}
finally {
client.close();
}
return null;
}
}
/**
* @param character
* @return Checks whether the returned data is sent as a JSONArray or a
* JSONObject.
*/
private Boolean isAJSONArray(Character character) {
if (character.toString().equals("[")) {
return true;
}
else {
return false;
}
}
/**
* Check for Internet connectivity.
*
* @return true if Internet connectivity is available, false if not.
*/
private Boolean checkInternet() {
final ConnectivityManager connectivityManager = (ConnectivityManager) _context.getSystemService(Context.CONNECTIVITY_SERVICE);
final NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
if (networkInfo != null) {
if (_devMode)
ELog.i(getClass().getName(), "Internet is available");
return true;
}
else {
if (_devMode)
ELog.i(getClass().getName(), "Internet is not available");
return false;
}
}
}
// GetJSONListener - your Activity which wants to user GetJSONGET should implement this interface
package com.domain.project.interfaces;
import org.json.JSONArray;
/**
* @author Janitha
*
*/
public interface GetJSONListener {
public void onGetJSONComplete(JSONArray data);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment