在GoogleDrive上上传文件时如何关闭打开的DataBuffer?

时间:2018-11-06 10:06:18

标签: kotlin google-drive-api google-drive-android-api

我正在将文件上传到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}") 
            }
}

然而,它在我的日志中以及在我上载例如3MB在GoogleDrive中大约变成9-12MB:

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?

0 个答案:

没有答案