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

前端 未结 5 1433
旧巷少年郎
旧巷少年郎 2020-12-20 15:55

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

相关标签:
5条回答
  • 2020-12-20 16:36

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

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

    0 讨论(0)
  • 2020-12-20 16:36

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

    while (bytesTransferred < totalSze) {
       ...
       wr.flush();
       publishProgress((int)rounded);
       ...
    }
    
    0 讨论(0)
  • 2020-12-20 16:40

    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));
                }
            }
        });
    }
    
    0 讨论(0)
  • 2020-12-20 16:48

    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);
            }
    
        }
    
    0 讨论(0)
  • 2020-12-20 16:52
    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();
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题