I am uploading string and photo.and its working fine. Now I want to show progress bar while uploading data with percentage but percentage show very quickly to 100 percentage
http://samir-mangroliya.blogspot.in/p/android-asynctask-example.html
Please open the above link,you will find the best possible answer.
Make sure to flush inside the while loop before updating progress:
while (bytesTransferred < totalSze) {
...
wr.flush();
publishProgress((int)rounded);
...
}
Take a look at this gist, there you can find full working exaple
First you have to create a custom RequestBody with an interface witch will update your progress bar.
import com.squareup.okhttp.MediaType;
import com.squareup.okhttp.RequestBody;
import com.squareup.okhttp.internal.Util;
import java.io.File;
import java.io.IOException;
import okio.BufferedSink;
import okio.Okio;
import okio.Source;
public class ProgressRequestBody extends RequestBody {
private static final int SEGMENT_SIZE = 2048; // okio.Segment.SIZE
private final File file;
private final ProgressListener listener;
private final String contentType;
public ProgressRequestBody(File file, String contentType, ProgressListener listener) {
this.file = file;
this.contentType = contentType;
this.listener = listener;
}
@Override
public long contentLength() {
return file.length();
}
@Override
public MediaType contentType() {
return MediaType.parse(contentType);
}
@Override
public void writeTo(BufferedSink sink) throws IOException {
Source source = null;
try {
source = Okio.source(file);
long total = 0;
long read;
while ((read = source.read(sink.buffer(), SEGMENT_SIZE)) != -1) {
total += read;
sink.flush();
this.listener.transferred(total);
}
} finally {
Util.closeQuietly(source);
}
}
public interface ProgressListener {
void transferred(long num);
}
}
you can copy this class as is
Now in your activity or fragment implement the ProgressListener from the ProgressRequestBody class and call a following methods
public void uploadWithProgrss(File file) {
RequestBody requestBody = new MultipartBuilder()
//build multipart request
.type(MultipartBuilder.FORM)
//name= KEY for your param
//filename = VALUE of the param - in our case filename
//attach the custom ProgressRequestBody in form of (File file, String type, Interface ProgressRequestBody.ProgressListener)
//Set type depending on your content type if video set it to "video/mp4" or "image/jpeg" if image
.addPart(Headers.of("Content-Disposition", "form-data; name=\"digital_product[attachment]\"; filename=\"" + file.getName() + "\""),
new ProgressRequestBody(file, type2, this))
//attach the rest of Request body parameters if any
.addPart(
Headers.of("Content-Disposition", "form-data; name=\"digital_product[price]\""),
RequestBody.create(MediaType.parse("text/plain"), etPrice.getText().toString()))
.addPart(
Headers.of("Content-Disposition", "form-data; name=\"digital_product[title]\""),
RequestBody.create(MediaType.parse("text/plain"), etCaption.getText().toString()))
.addPart(
Headers.of("Content-Disposition", "form-data; name=\"digital_product[description]\""),
RequestBody.create(MediaType.parse("text/plain"), etCaption.getText().toString()))
.build();
//Build your request
Request request = new Request.Builder()
//your url
.url(BuildConfig.API_URL + "api/v1/users/me/digital_products")
//request header if any
.addHeader("Authorization", "Bearer " + app.getAccessToken())
//type of the request, i this case post request with request body
.post(requestBody)
.build();
client.setReadTimeout(1, TimeUnit.MINUTES);
client.setConnectTimeout(1, TimeUnit.MINUTES);
client.setWriteTimeout(1, TimeUnit.MINUTES);
final Call call = client.newCall(request);
call.enqueue(new com.squareup.okhttp.Callback() {
@Override
public void onFailure(Request request, IOException e) {
}
@Override
public void onResponse(com.squareup.okhttp.Response response) throws IOException {
if (response.isSuccessful()) {
//Handle success
} else {
call.cancel();
//handle error
}
}
});
}
@Override
public void transferred(final long num) {
//progress bar had to be updated from the UI thread
new Handler(activity.getMainLooper()).post(new Runnable() {
@Override
public void run() {
//just chacking if fragment is added
if (isAdded()) {
//Updating progress bar
progressBar.setProgress((int) ((num / (float) file.length()) * 100));
}
}
});
}
Check out this tutorial - http://www.androidhive.info/2014/12/android-uploading-camera-image-video-to-server-with-progress-bar/
private class UploadFileToServer extends AsyncTask<Void, Integer, String> {
@Override
protected void onPreExecute() {
// setting progress bar to zero
progressBar.setProgress(0);
super.onPreExecute();
}
@Override
protected void onProgressUpdate(Integer... progress) {
// Making progress bar visible
progressBar.setVisibility(View.VISIBLE);
// updating progress bar value
progressBar.setProgress(progress[0]);
// updating percentage value
txtPercentage.setText(String.valueOf(progress[0]) + "%");
}
@Override
protected String doInBackground(Void... params) {
return uploadFile();
}
@SuppressWarnings("deprecation")
private String uploadFile() {
String responseString = null;
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(Config.FILE_UPLOAD_URL);
try {
AndroidMultiPartEntity entity = new AndroidMultiPartEntity(
new ProgressListener() {
@Override
public void transferred(long num) {
publishProgress((int) ((num / (float) totalSize) * 100));
}
});
File sourceFile = new File(filePath);
// Adding file data to http body
entity.addPart("image", new FileBody(sourceFile));
// Extra parameters if you want to pass to server
entity.addPart("website",
new StringBody("www.androidhive.info"));
entity.addPart("email", new StringBody("abc@gmail.com"));
totalSize = entity.getContentLength();
httppost.setEntity(entity);
// Making server call
HttpResponse response = httpclient.execute(httppost);
HttpEntity r_entity = response.getEntity();
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode == 200) {
// Server response
responseString = EntityUtils.toString(r_entity);
} else {
responseString = "Error occurred! Http Status Code: "
+ statusCode;
}
} catch (ClientProtocolException e) {
responseString = e.toString();
} catch (IOException e) {
responseString = e.toString();
}
return responseString;
}
@Override
protected void onPostExecute(String result) {
Log.e(TAG, "Response from server: " + result);
// showing the server response in an alert dialog
showAlert(result);
super.onPostExecute(result);
}
}
protected class upload_images extends AsyncTask<String, Integer, String> {
ProgressDialog progressDialog;
@Override
protected void onPreExecute() {
super.onPreExecute();
// showDialog(progress_bar_type);
progressDialog = new ProgressDialog(Accept_Report.this);
progressDialog.setCancelable(false);
// dialog.setCanceledOnTouchOutside(false);
progressDialog.setIndeterminate(false);
// progressDialog.setMax(100);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
// progressDialog.setProgress(0);
progressDialog.setMax(100);
// progressDialog.setMessage("Loading ...");
progressDialog.show();
// ProgressBar progressBar = (ProgressBar)findViewById(R.id.progressBar2);
}
@Override
protected String doInBackground(String... params) {
URL url;
HttpURLConnection connection = null;
String http = Util.URL + "reports/media/create";
try {
url = new URL(http);
connection = (HttpURLConnection) url.openConnection();
.
.
.
connection.connect();
...
// you are doing this
// what is jsonParam ?
//byte[] payload = jsonParam.toString().getBytes("UTF-8");
// how you gonna get content lenght from it?
int count = 0;
OutputStream wr = connection.getOutputStream();
InputStream inputStream = null;
byte[] payload = jsonParam.toString().getBytes("UTF-8");
int totalSze = payload.length;
Log.e("Total size ", "" + totalSze);
int bytesTransferred = 0;
int chunkSize = (2 * totalSze) / 100;
boolean last_loop = false;
// publishProgress(0);
...
// Do like this example
// getting file length
int lenghtOfFile = connection.getContentLength();
// input stream to read file - with 8k buffer
InputStream input = new BufferedInputStream(url.openStream(), 8192);
// Output stream to write file
OutputStream output = new FileOutputStream("/sdcard/downloadedfile.jpg");
byte data[] = new byte[1024];
long total = 0;
while ((count = input.read(data)) != -1) {
total += count;
// publishing the progress....
// After this onProgressUpdate will be called
publishProgress((int) ((total * 100) / lenghtOfFile));
// writing data to file
output.write(data, 0, count);
}
} catch (Exception e) {
}
return null;
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
// Log.e("dfsf",""+values[0]);
progressDialog.setProgress(values[0]);
// progressDialog.setProgress(values[0]);
}
@Override
protected void onPostExecute(String result) {
if (HttpResultimage == 204) {
progressDialog.dismiss();
}
}
}