Android : How to implement long-running network uploads in Android not using AsyncTask and not using libraries

on Sunday, August 31, 2014


What is the native Android way to implement long running network operations (like uploading a bunch of photos) without having to use libraries like RoboSpice?


How do I replace my asynctask with something else?


Now, I've heard of handlers, executors, services and what not, but how exactly do I implement them in my code and which one to choose?


Here is an example of the asynctask I use


I have removed a lot of code, just so you can see the basic structure



public class UploadPhotosToServer extends AsyncTask<String, Void, Boolean> {

@Override
protected Boolean doInBackground(String... args) {

HashMap<String, String> params = new HashMap<String, String>();


try {
if(uploadImageToServer(id, path, params)) {
success = true;
} else {
success = false;
}
} catch (Exception e) {
e.printStackTrace();
success = false;
}


return success;
}

public boolean uploadImageToServer(int imageId, String imagePath, HashMap<String, String> params) throws Exception {

try {
JSONObject json = jsonParser.uploadImageToServer(imagePath, params);
JSONObject message = json.getJSONObject("message");
String serverResponse = message.getString("success");
if (serverResponse.contentEquals("true") {
return true;
} else {
return false;
}
} catch (JSONException e) {
e.printStackTrace();
return false;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}

}


and here is jsonParser.uploadImageToServer



public JSONObject uploadImageToServer(String imagePath, HashMap<String, String> params) throws Exception {
HttpClient httpClient;
HttpResponse response;
MultipartEntityBuilder multipartEntity;
HttpPost postRequest;
HttpContext localContext;
Bitmap bitmap;

try {
// Set the http handlers
httpClient = new DefaultHttpClient();
localContext = new BasicHttpContext();
postRequest = new HttpPost(API.IMAGES);
// Deal with the file
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
bitmap = BitmapFactory.decodeFile(imagePath);
bitmap.compress(CompressFormat.JPEG, 100, byteArrayOutputStream);
bitmap.recycle();
// Second parameter is the image quality in per cent. The bitmap converts into the third parameter that we later
// use.
byte[] byteData = byteArrayOutputStream.toByteArray();
ByteArrayBody byteArrayBody = new ByteArrayBody(byteData, "temp_image"); // second parameter is the name of the
// image
// Send the package
multipartEntity = MultipartEntityBuilder.create();
multipartEntity.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
multipartEntity.addPart("file", byteArrayBody);
for (Map.Entry<String, String> entry : params.entrySet()) {
multipartEntity.addTextBody(entry.getKey(), entry.getValue());
}
postRequest.setEntity(multipartEntity.build());
// Get the response. we will deal with it in onPostExecute.
response = httpClient.execute(postRequest, localContext);
HttpEntity httpEntity = response.getEntity();
inputStream = httpEntity.getContent();
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "iso-8859-1"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
json = sb.toString();
inputStream.close();
reader.close();
} catch (ClientProtocolException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
httpClient.getConnectionManager().shutdown();
// Try parsing the string to a JSON object
try {
jsonObject = new JSONObject(json);
} catch (JSONException e) {
e.printStackTrace();
}
// Return JSON String
return jsonObject;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}

0 comments:

Post a Comment