Как закрыть открытый DataBuffer при загрузке файлов в GoogleDrive? - PullRequest
0 голосов
/ 06 ноября 2018

Я загружаю файлы в личное хранилище GoogleDrive. Этот Java-код не выдает никаких предупреждений или ошибок в положительных случаях и работает должным образом.

// [START drive_android_create_file_in_appfolder]
private void createFileInAppFolder() {
    final Task<DriveFolder> appFolderTask = getDriveResourceClient().getAppFolder();
    final Task<DriveContents> createContentsTask = getDriveResourceClient().createContents();
    Tasks.whenAll(appFolderTask, createContentsTask)
            .continueWithTask(task -> {
                DriveFolder parent = appFolderTask.getResult();
                DriveContents contents = createContentsTask.getResult();
                OutputStream outputStream = contents.getOutputStream();
                try (Writer writer = new OutputStreamWriter(outputStream)) {
                    writer.write("Hello World!");
                }

                MetadataChangeSet changeSet = new MetadataChangeSet.Builder()
                        .setTitle("New file")
                        .setMimeType("text/plain")
                        .setStarred(true)
                        .build();

                return getDriveResourceClient().createFile(parent, changeSet, contents);
            })
            .addOnSuccessListener(this,
                    driveFile -> {
                        showMessage(getString(R.string.file_created,
                                driveFile.getDriveId().encodeToString()));
                        finish();
                    })
            .addOnFailureListener(this, e -> {
                Log.e(TAG, "Unable to create file", e);
                showMessage(getString(R.string.file_create_error));
                finish();
            });
}
// [END drive_android_create_file_in_appfolder]

Но я использую kotlin в своем проекте, поэтому скопируйте и вставьте эту функцию в мой код и теперь с небольшим преобразованием:

private fun createFileInAppFolder() { 

    val appFolderTask = mDriveResourceClient?.appFolder
    val createContentsTask = mDriveResourceClient?.createContents()
    Tasks.whenAll(appFolderTask, createContentsTask)
            .continueWithTask { task ->
                val parent = appFolderTask?.result
                val contents = createContentsTask?.result
                val outputStream = contents!!.outputStream

                OutputStreamWriter(outputStream).use { writer -> writer.write(getJSONContent()) }

                val changeSet = MetadataChangeSet.Builder()
                        .setTitle(Constants.BACKUP_FILE_NAME)
                        .setMimeType(Constants.BACKUP_FILE_MIME_TYPE)
                        .setStarred(true)
                        .build()

                mDriveResourceClient?.createFile(parent!!, changeSet, contents)
            }
            .addOnSuccessListener { it ->
                Log.e(TAG, "Created file id: ${it.driveId.encodeToString()}")
            }.addOnFailureListener { it ->
                Log.e(TAG, "Unable to create file: ${it.localizedMessage}") 
            }
}

Однако в моих журналах постоянно упоминается следующая ошибка, а также, если я загружаю данные, например, например. 3 МБ в GoogleDrive становится около 9-12 МБ:

E/DataBuffer: Internal data leak within a DataBuffer object detected!  Be sure to explicitly call release() on all DataBuffer extending objects when you are done with them. (internal object: com.google.android.gms.common.data.DataHolder@7ff040b)

Итак, мой вопрос: как я могу закрыть открытый DataBuffer, который открыт, это мой случай?

...