2014-03-13 20 views
2

此问题针对Google Drive Android API support team。这可能被认为是一个错误或只是单挑注意。当测试GDAA我碰到的这个问题:新Google Drive Android API - 未完成文件的元数据过早可用

  1. 我创建asynchronyously
  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 
+0

什么意思是“没有准备好”? –

+0

我打电话给createFileAsync()。它立即取回(它是异步的),但是文件实际上是稍后创建的(在createFileAsync()中有两个级联的异步回调)。在此期间(文件创建尚未完成),可以通过上面的findFirst()调用找到该文件。如果你在这里grep'SystemClock.sleep(2000)',你会看到它:https://github.com/seanpjanson/140201-GDAA/blob/master/awaits/MainActivity.java – seanpj

+0

改写:进入createFileAsync ()和第二个onResult()。在此期间,该应用程序可以调用Drive.DriveApi.query(...)。在这段时间内应该使用Drive.DriveApi.query(...)。await()来找到文件吗?它被发现并且它的元数据不稳定。 – seanpj

回答

0

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

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

正常工作,现在,没有任何枚举直到元数据“的文件已准备就绪”。