-
-
Save JanithaR/ff97f074c18b3eea0e0b to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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; | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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