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 に答える