2014-03-13 1 views
2

이 문제는 Google Drive Android API support team에게 발생합니다. 그것은 버그로 간주 될지도 모르고 그냥 헤드 업 노트로 간주 될 수도 있습니다. GDAA을 테스트 할 때 나는이 문제로 실행했습니다 내가 asynchronyously 파일이 준비되기 전에, 내가 검색을 수행하고 이름으로 파일을 발견 NEW Google 드라이브 Android API - 미완료 파일의 메타 데이터가 중간에 사용 가능합니다.

  • 그것과 메타 데이터의 검색 관리 파일을 생성
    1. 메타 데이터를 사용하는
    2. 시도 문제의 흔적이

    요점은 (명백하게) 폭발하지 : 파일 검색 또는 메타 데이터 검색은 파일이 준비가되지 않기 때문입니다 안/아직 존재하지 않는 이유는 무엇입니까? 아니면 그것을 확인하는 방법이 있습니까? 여기

    문제 (간체 -하지 생산 수준 코드) 입증하는 코드 조각입니다

    원시적 # 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()에 2 개의 계단식 비동기 콜백이 있음). 그 시간 동안 (파일 생성이 아직 끝나지 않은 경우), 파일은 이미 위의 findFirst() 호출에 의해 발견 될 수 있습니다. 여기에서 'SystemClock.sleep (2000)'에 대한 grep을 보시면 알 수 있습니다 : https://github.com/seanpjanson/140201-GDAA/blob/master/awaits/MainActivity.java – seanpj

    +0

    Rephrasing : 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!!! 
    

    는 '파일이 준비가되어'때까지 메타 데이터를 열거하지, 이제 제대로 작동합니다.