Result callback in loop (Download multiple images from google drive.)

171 Views Asked by At

I am working on Google Drive Api. I want to download images from Google drive. Below is the code which is working but the files.open() is called when the loop finishes. Suppose the count is 3, the loop will complete looping first and after that files.open() will be called 3 times. Because of this I am not able to set the data in my model class. It takes only last value. (Edited)

    if (getGoogleApiClient() != null && getGoogleApiClient().isConnected()) {
        try {
            final DriveFolder pFldr = Drive.DriveApi.getRootFolder(getGoogleApiClient());
            pFldr.listChildren(getGoogleApiClient()).setResultCallback(new ResultCallback<DriveApi.MetadataBufferResult>() {
                @Override
                public void onResult(DriveApi.MetadataBufferResult metadataBufferResult) {
                    int count = metadataBufferResult.getMetadataBuffer().getCount();
                    Log.e("COUNT---", count + "");
                    MetadataBuffer buffer = metadataBufferResult.getMetadataBuffer();
                    if (count > 0) {
                        for (int i = 0; i < count; i++) {
                            if (buffer.get(i).getMimeType().equals("image/jpeg")) {
                                Log.e("Images avaialbe - ", "" + buffer.get(i).getTitle());
                                DriveId id = buffer.get(i).getDriveId();
                                DriveFile files = Drive.DriveApi.getFile(getGoogleApiClient(), id);
                                driveModel.setTitle(buffer.get(i).getTitle());

                                files.open(getGoogleApiClient(), DriveFile.MODE_READ_ONLY, null).setResultCallback(saveImageCallback);
                            }
                            if (buffer.get(i).getMimeType().equals("application/x-sqlite3")) {
                                DriveId id = buffer.get(i).getDriveId();
                                DriveFile files = Drive.DriveApi.getFile(getGoogleApiClient(), id);
                                files.open(getGoogleApiClient(), DriveFile.MODE_READ_ONLY, null).setResultCallback(saveDataBaseCallback);
                            }
                        }

                        buffer.release();
                        showMessage("Success");
                    } else {
                        showMessage("No Back Up available.");
                    }
                }
            });

        } finally {

    }

}

        ResultCallback<DriveApi.DriveContentsResult> saveImageCallback = new ResultCallback<DriveApi.DriveContentsResult>() {
            @Override
            public void onResult(DriveApi.DriveContentsResult driveContentsResult) {

                DriveContents cont = driveContentsResult.getDriveContents();
                InputStream inputStream = cont.getInputStream();
                try {

                    saveFiles(inputStream, driveModel.getTitle(), false);
                    cont.discard(getGoogleApiClient());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
1

There are 1 best solutions below

3
On BEST ANSWER

Try this: 1.) Change to ArrayList<DriveModel> driveFileList; 2.)

 pFldr.listChildren
               (getGoogleApiClient())
               .setResultCallback(new ResultCallback<DriveApi.MetadataBufferResult>() {
                 @Override
                 public void onResult(DriveApi.MetadataBufferResult metadataBufferResult) {
                 int count = metadataBufferResult.getMetadataBuffer().getCount();
                 Log.e("COUNT---", count + "");
                 Log.e("CHECk" , "Calling callback read from googledrive");
                 MetadataBuffer buffer = metadataBufferResult.getMetadataBuffer();
                 if (count > 0) {
                     for (int i = 0; i < count; i++) {
                     final int finalI = i;

                     Log.e("CHECk" , "reading file " + buffer.get(i).getTitle());
                     Log.e("Files avaialbe - ", "" + buffer.get(i).getTitle());
                     driveModel=new DriveModel();
                     DriveId id = buffer.get(i).getDriveId();
                     DriveFile files = Drive.DriveApi.getFile(getGoogleApiClient(), id);

                     if (buffer.get(i).getMimeType().equals("image/jpeg") ||
                           buffer.get(i).getMimeType().equals("image/png")) {

                          driveModel.setTitle(buffer.get(i).getTitle());
                          Log.e("Images avaialbe - ", "" + buffer.get(i).getTitle());
                          // driveModel.setTitle(buffer.get(i).getTitle());


                    files.open(getGoogleApiClient(), DriveFile.MODE_READ_ONLY, null)
                      .setResultCallback(new ResultCallback<DriveApi.DriveContentsResult>() {
                              @Override
                               public void onResult(@NonNull DriveApi.DriveContentsResult driveContentsResult) {
                                               saveData(driveContentsResult, finalI);
                                    }
                                });
                                      driveFileList.add(driveModel);

                                      }

                    if (buffer.get(i).getMimeType().equals("application/x-sqlite3")) {

                           files.open(getGoogleApiClient(), DriveFile.MODE_READ_ONLY, null)
                                  .setResultCallback(new ResultCallback<DriveApi.DriveContentsResult>() {
                                      @Override
                                      public void onResult(@NonNull DriveApi.DriveContentsResult driveContentsResult) {
                                      saveData(driveContentsResult, finalI);
                                 }
                             });

                          }

                      }

                              buffer.release();
                              showMessage("Success");
                     } else {
                               showMessage("No Back Up available.");
                            }

                           }
                 }

            );

3.) create the method :

 private void saveData(DriveApi.DriveContentsResult driveContentsResult, int i) {
            Log.e("CHECk" , "Calling callback " + driveContentsResult.getDriveContents().getDriveId().encodeToString() );
            DriveContents cont = driveContentsResult.getDriveContents();

            Log.e("File name :" ,  "File : " + driveFileList.get(i).getTitle());

//Put your code here
            InputStream inputStream = cont.getInputStream();
            try {

                saveFiles(inputStream, true);
                cont.discard(getGoogleApiClient());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }