이 문제는 Google Drive Android API support team에게 발생합니다. 그것은 버그로 간주 될지도 모르고 그냥 헤드 업 노트로 간주 될 수도 있습니다. GDAA을 테스트 할 때 나는이 문제로 실행했습니다 내가 asynchronyously 파일이 준비되기 전에, 내가 검색을 수행하고 이름으로 파일을 발견 NEW Google 드라이브 Android API - 미완료 파일의 메타 데이터가 중간에 사용 가능합니다.
는- 메타 데이터를 사용하는
- 시도 문제의 흔적이
요점은 (명백하게) 폭발하지 : 파일 검색 또는 메타 데이터 검색은 파일이 준비가되지 않기 때문입니다 안/아직 존재하지 않는 이유는 무엇입니까? 아니면 그것을 확인하는 방법이 있습니까? 여기
문제 (간체 -하지 생산 수준 코드) 입증하는 코드 조각입니다
원시적 # 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()에 2 개의 계단식 비동기 콜백이 있음). 그 시간 동안 (파일 생성이 아직 끝나지 않은 경우), 파일은 이미 위의 findFirst() 호출에 의해 발견 될 수 있습니다. 여기에서 'SystemClock.sleep (2000)'에 대한 grep을 보시면 알 수 있습니다 : https://github.com/seanpjanson/140201-GDAA/blob/master/awaits/MainActivity.java – seanpj
Rephrasing : createFileAsync 입력 사이에 시간이 있습니다.()와 두 번째 onResult()입니다. 앱은 그 시간 동안 Drive.DriveApi.query (...)를 호출 할 수 있습니다. 이 시간 동안 Drive.DriveApi.query (...). await()를 사용하여 파일을 찾아야합니까? 발견되었으며 메타 데이터가 안정적이지 않습니다. – seanpj