Assem Mahrous
Assem Mahrous

Reputation: 421

Waiting inside loop for the method to finish executing

I have a For loop in which I call a method to upload images to the server , the problem that i am facing that at a certain limit the server will force stop the opened socket so i have to upload every image at once

for (int i = 0; i < paths.size(); i++) {
    transferData(paths.get(i), i);
}

and the transferData Function I am using the transfer Utility aws s3 function

TransferUtility transferUtility =
            TransferUtility.builder()
                    .context(this)
                    .awsConfiguration(AWSMobileClient.getInstance().getConfiguration())
                    .s3Client(amazonS3Client)
                    .defaultBucket("name")
                    .build();

TransferObserver uploadObserver = transferUtility.upload("name", name, new File(path), CannedAccessControlList.PublicRead);
    uploadObserver.setTransferListener(new TransferListener() {

        @Override
        public void onStateChanged(int id, TransferState state) {
            Log.d(TAG, "onStateChanged: " + id + ", " + state);
            if (TransferState.COMPLETED == state) {
            }
        }

        @Override
        public void onProgressChanged(int id, long bytesCurrent, long bytesTotal) {
            float percentDonef = ((float) bytesCurrent / (float) bytesTotal) * 100;
            int percentage = (int) percentDonef;            
            Log.d(TAG, "onProgressChanged: " + percentage);                        
        }

        @Override
        public void onError(int id, Exception ex) {
            Log.e(TAG, "Error during upload: " + id, ex);
            try {
                showToast(ex.getMessage());
            } catch (Exception e) {
                e.printStackTrace();
            }
            ex.printStackTrace();
        }

    });

How to wait for the method to finish execution then continue the loop

Upvotes: 1

Views: 772

Answers (1)

mostafa3dmax
mostafa3dmax

Reputation: 1017

to wait loop use this code :

CountDownLatch latch=new CountDownLatch(1);

for (int i = 0; i < paths.size(); i++) {
    transferData(paths.get(i), i);
    try {
            latch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

}

and put this at the end of your method that finished upload image or failed

latch.countDown();

when your method rich to latch.countDown(); your loop will be continue notice that you must put your loop in another thread except main thread

Upvotes: 1

Related Questions