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

与世无争的帅哥 提交于 2019-11-29 13:27:55

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

    }

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

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);
   ...
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!