Search code examples
javaandroiduploadprogressdialogmultipart

Implementing ProgressDialog in Multipart Upload Request


I am using following method to upload an image from Android to server.

 public void uploadMultipart() {
        //getting name for the image
        String name = editText.getText().toString().trim();

        //getting the actual path of the image
        String path = getPath(filePath);


        progress = ProgressDialog.show(this, "Subiendo imagen",
                "Por favor, espere...", true);
        //Uploading code
        try {
            String uploadId = UUID.randomUUID().toString();

            //Creating a multi part request
            new MultipartUploadRequest(this, uploadId, Constants.UPLOAD_URL)
                    .addFileToUpload(path, "image") //Adding file
                    .addParameter("name", name) //Adding text parameter to the request
                    .setNotificationConfig(new UploadNotificationConfig())
                    .setMaxRetries(2)
                    .startUpload(); //Starting the upload


        } catch (Exception exc) {
            Toast.makeText(this, exc.getMessage(), Toast.LENGTH_SHORT).show();
        }

    }

Now I want to implement a ProgressDialog that should be dismissed when the upload finishes. I don´t know when the multi part request ends.

Thank you


Solution

  • Having this class:

    public class SingleUploadBroadcastReceiver extends UploadServiceBroadcastReceiver {
    
        public interface Delegate {
            void onProgress(int progress);
            void onProgress(long uploadedBytes, long totalBytes);
            void onError(Exception exception);
            void onCompleted(int serverResponseCode, byte[] serverResponseBody);
            void onCancelled();
        }
    
        private String mUploadID;
        private Delegate mDelegate;
    
        public void setUploadID(String uploadID) {
            mUploadID = uploadID;
        }
    
        public void setDelegate(Delegate delegate) {
            mDelegate = delegate;
        }
    
        @Override
        public void onProgress(String uploadId, int progress) {
            if (uploadId.equals(mUploadID) && mDelegate != null) {
                mDelegate.onProgress(progress);
            }
        }
    
        @Override
        public void onProgress(String uploadId, long uploadedBytes, long totalBytes) {
            if (uploadId.equals(mUploadID) && mDelegate != null) {
                mDelegate.onProgress(uploadedBytes, totalBytes);
            }
        }
    
        @Override
        public void onError(String uploadId, Exception exception) {
            if (uploadId.equals(mUploadID) && mDelegate != null) {
                mDelegate.onError(exception);
            }
        }
    
        @Override
        public void onCompleted(String uploadId, int serverResponseCode, byte[] serverResponseBody) {
            if (uploadId.equals(mUploadID) && mDelegate != null) {
                mDelegate.onCompleted(serverResponseCode, serverResponseBody);
            }
        }
    
        @Override
        public void onCancelled(String uploadId) {
            if (uploadId.equals(mUploadID) && mDelegate != null) {
                mDelegate.onCancelled();
            }
        }
    }
    

    Then in your activity:

    public class YourActivity extends Activity implements SingleUploadBroadcastReceiver.Delegate {
    
        private static final String TAG = "AndroidUploadService";
    
        private final SingleUploadBroadcastReceiver uploadReceiver =
            new SingleUploadBroadcastReceiver();
    
        @Override
        protected void onResume() {
            super.onResume();
            uploadReceiver.register(this);
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            uploadReceiver.unregister(this);
        }
    
        public void uploadMultipart(final Context context) {
            try {
                String uploadId = UUID.randomUUID().toString();
                uploadReceiver.setDelegate(this);
                uploadReceiver.setUploadID(uploadId);
    
                new MultipartUploadRequest(context, uploadId, "http://upload.server.com/path")
                    .addFileToUpload("/absolute/path/to/your/file", "your-param-name")
                    .setNotificationConfig(new UploadNotificationConfig())
                    .setMaxRetries(2)
                    .startUpload();
    
            } catch (Exception exc) {
                Log.e(TAG, exc.getMessage(), exc);
            }
        }
    
        @Override
        public void onProgress(int progress) {
            //your implementation
        }
    
        @Override
        public void onProgress(long uploadedBytes, long totalBytes) {
            //your implementation
        }
    
        @Override
        public void onError(Exception exception) {
            //your implementation
        }
    
        @Override
        public void onCompleted(int serverResponseCode, byte[] serverResponseBody) {
            //your implementation
        }
    
        @Override
        public void onCancelled() {
            //your implementation
        }
    
    }
    

    Now you'll have appropriate callbacks fired upon successful/unsuccessful upload.

    source