2
此问题针对Google Drive Android API support team。这可能被认为是一个错误或只是单挑注意。当测试GDAA我碰到的这个问题:新Google Drive Android API - 未完成文件的元数据过早可用
- 我创建asynchronyously
- 文件已经准备好之前,我进行了搜索,发现通过文件名的文件
- 管理检索它的元数据文件没有问题
- 尝试使用元数据标志炸毁了(显然)
的一点是:不应搜索文件或元数据检索显示,文件还没有准备好/不存在了吗?或者有没有一种方法来检查?
下面是代码片段来演示该问题(简化 - 不是一个生产水平代码)
原始#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
什么意思是“没有准备好”? –
我打电话给createFileAsync()。它立即取回(它是异步的),但是文件实际上是稍后创建的(在createFileAsync()中有两个级联的异步回调)。在此期间(文件创建尚未完成),可以通过上面的findFirst()调用找到该文件。如果你在这里grep'SystemClock.sleep(2000)',你会看到它:https://github.com/seanpjanson/140201-GDAA/blob/master/awaits/MainActivity.java – seanpj
改写:进入createFileAsync ()和第二个onResult()。在此期间,该应用程序可以调用Drive.DriveApi.query(...)。在这段时间内应该使用Drive.DriveApi.query(...)。await()来找到文件吗?它被发现并且它的元数据不稳定。 – seanpj