How to show progress bar status by percentage while uploading json data?
Asked Answered
D

5

10

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 and take some more time to upload and finally come to the post execute method.

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.setDoInput(true);
                    connection.setRequestMethod("POST");
                  /*  connection.setConnectTimeout(50000);
                    connection.setReadTimeout(50000);*/
                    connection.setRequestProperty("Content-Type", "application/json");
                    connection.setRequestProperty("Content-Language", "en-US");
                    String encoded = Base64.encodeToString(("app" + ":" + "sFif4au7wet8gpsT0boK1oM2Yud6M1").getBytes("UTF-8"), Base64.NO_WRAP);
                    connection.setRequestProperty("Authorization", "Basic " + encoded);
                    connection.setUseCaches(false);
                    connection.setDoOutput(true);
                    connection.connect();

                    jsonArray = new JSONArray();

                    right = send_right.toString().replaceAll("\\[", "").replaceAll("\\]", "");
                    if((right!=null)&&(right!="")) {
                        JSONObject pnObj = new JSONObject();
                        pnObj.put("comments", right_cm);
                        pnObj.put("section", right_sec);
                        pnObj.put("pictures", right);
                        jsonArray.put(pnObj);
                    }    

                       // return totalSize;

                     JSONObject jsonParam = new JSONObject();
                     jsonParam.put("media", jsonArray);

                    //Send request


                        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);

                        while (bytesTransferred < totalSze) {

                            Log.e("bytes transferred", "" + bytesTransferred);
                            int nextChunkSize = totalSze - bytesTransferred;
                            Log.e("nextchunck",""+nextChunkSize);

                            //int writer_size = wr.toString().getBytes("UTF-8").length;
                            Log.e("chunk size", "" + chunkSize);
                            if (nextChunkSize > chunkSize) {
                                nextChunkSize = chunkSize;
                            }


                            wr.write(payload, bytesTransferred, nextChunkSize);
                            bytesTransferred += nextChunkSize;
                            Log.e("byte",""+wr.toString().getBytes("UTF-8").length);

                            Log.e("progress-transferred", "" + bytesTransferred +" total "+totalSze);


                            double cal = (( (double)bytesTransferred / (double) totalSze) * 100);

                            double rounded = (double) Math.round(cal * 100.0) / 100.0;

                            Log.e("progress",""+(int)rounded);

                            publishProgress((int)rounded);

                        wr.flush();
                        wr.close();

                            }catch(Exception e){
                                Log.d("Exception", e.toString());
                            }
                        }*/
                        Log.e("While loop exit", "");
                      /*  wr.flush ();
                        wr.close();*/


                    }catch (OutOfMemoryError e)
                    {
                        e.printStackTrace();
                    }

                    //Get Response
                    StringBuilder sb = new StringBuilder();
                    HttpResultimage =connection.getResponseCode();
                    Log.e("res",""+HttpResultimage);

                    if(HttpResultimage==204)
                    {
                        BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream(),"utf-8"));
                        String line = null;
                        while ((line = br.readLine()) != null) {
                            sb.append(line + "\n");
                        }
                        br.close();
                        System.out.println("" + sb.toString());
                    }else{
                    }



                } catch (Exception e) {
                    e.printStackTrace();
                    return null;
                } finally {
                    if(connection != null) {
                        connection.disconnect();
                    }
                }
                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();
                }
            }
        }
Dosimeter answered 26/5, 2016 at 9:44 Comment(3)
1. Do 80% while uploading and 20% when get response back, 2. Don't close output stream while writing to it. just flush it. and post increamentKnur
i was closed output stream in my coding and i need to show upload percentage one by oneDosimeter
can use this library:github.com/koush/ionHeavierthanair
P
3

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("[email protected]"));

                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);
        }

    }
Poinciana answered 31/5, 2016 at 6:50 Comment(1)
above httpclient methods are removed in marshmallow so i can't do itDosimeter
G
3

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));
            }
        }
    });
}
Gallstone answered 2/6, 2016 at 3:25 Comment(1)
Link-only answers are generally frowned upon on Stack Overflow. In time it is possible for links to atrophy and become unavailable, meaning that your answer is useless to users in the future. It would be best if you could provide the general details of your answer in your actual post, citing your link as a reference.Slay
S
1
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();
        }
    }
}
Sanhedrin answered 2/6, 2016 at 5:39 Comment(3)
I want to upload the data to server not the sd cardDosimeter
@Ajinkumar its sample for counting no of bytes transfer ......and you haven't explain whats jsonParam on which basis you publishing progress.Sanhedrin
I have just add some comments,section and picture(base64 string) to json array like this {"media":[{"comments":"","section":4,"pictures":"iVBORw0KGgoAAAANSUh"}] }. and add this json array to jsonParam(JSONObject variable) then send the JSONObject to serverDosimeter
B
1

http://samir-mangroliya.blogspot.in/p/android-asynctask-example.html

Please open the above link,you will find the best possible answer.

Balfour answered 4/6, 2016 at 6:45 Comment(1)
Link-only answers are generally frowned upon on Stack Overflow. In time it is possible for links to atrophy and become unavailable, meaning that your answer is useless to users in the future. It would be best if you could provide the general details of your answer in your actual post, citing your link as a reference.Slay
T
0

Make sure to flush inside the while loop before updating progress:

while (bytesTransferred < totalSze) {
   ...
   wr.flush();
   publishProgress((int)rounded);
   ...
}
Temperate answered 5/6, 2016 at 17:30 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.