2

此问题已提交给Google Drive Android API 支持团队。它可能被认为是一个错误或只是提示。在测试 GDAA 时,我遇到了这个问题:

  1. 我异步创建了一个文件
  2. 在文件准备好之前,我进行了搜索并按名称找到了文件
  3. 设法检索它的元数据,没有任何问题的迹象
  4. 尝试使用爆炸的元数据(显然)

关键是:文件搜索或元数据检索不应该表明文件尚未准备好/还不存在吗?或者有什么方法可以检查吗?

以下是演示问题的代码片段(简化 - 不是生产级代码)

原语 #1 创建文件异步

  void createFileAsync(final DriveFolder fldr, final String name, 
                                                          final String mime, final byte[] buff) {
    final DriveId  dId = fldr.getDriveId();
    Drive.DriveApi.newContents(_gac).setResultCallback(new ResultCallback<ContentsResult>() {
      @Override public void onResult(ContentsResult rslt) {
        if (!rslt.getStatus().isSuccess()) return; 
        DriveFolder folder = Drive.DriveApi.getFolder(_gac, dId);
        MetadataChangeSet meta = new MetadataChangeSet.Builder()
                                                       .setTitle(name).setMimeType(mime).build();
        folder.createFile(_gac, meta, rslt.getContents()).setResultCallback(
                                                          new ResultCallback<DriveFileResult>() {
          @Override public void onResult(DriveFileResult rslt) {
            _dFile = rslt.getStatus().isSuccess() ? rslt.getDriveFile() : null; 
          }
        });
      }
    });
  }

原始 #2 按名称查找文件 - 等待

  public DriveFile findFirst(String name) {
    Filter filtr = Filters.and(
      Filters.eq(SearchableField.TRASHED, false),
      Filters.eq(SearchableField.TITLE, name)
    ); 
    Query qry = new Query.Builder().addFilter(filtr).build(); 
    MetadataBufferResult rslt = (Drive.DriveApi.query(_gac, qry).await()
    if (rslt.getStatus().isSuccess()) {
      MetadataBuffer mdb = null;
      try { 
        mdb = rslt.getMetadataBuffer();
        return Drive.DriveApi.getFile(_gac, mdb.get(0).getDriveId());          
      } finally { if (mdb != null) mdb.close(); } 
    }
    return null;
  }

测试/问题场景:

  GoogleApiClient _gac;   

  DriveFolder fldr = Drive.DriveApi.getRootFolder(_gac);
  byte[] buffer = ("FooBar ").getBytes();

  // create a file async
  DriveFile _dFile = null;
  createFileAsync(fldr, "foo", "text/plain", buffer);

  // file is not ready yet, but FOUND and it's metadata VALID (non-null)
  Metadata md = findFirst("foo").getMetadata(_gac).await().getMetadata();

  // any attempt to use Metadata methods 
  // md.isTrashed(), md.getTitle(), ...
  // blows up until the  createFileAsync() is finished
4

1 回答 1

0

我很高兴地报告问题消失了(通过干预?)。在创建完成之前,对正在创建(异步)的文件的名称查询不会返回有效的元数据。上面原始#2的简化代码块:

for (Metadata md : rslt.getMetadataBuffer()) 
   ;  // NO md AVAILABLE until the file creation is completed!!! 

现在可以正常工作,在“文件准备好”之前不会枚举任何元数据。

于 2014-03-17T16:13:03.400 回答