当前位置: 首页 > 知识库问答 >
问题:

Google Drive Android API中driveId.getResourceID()的不可预测结果

徐峰
2023-03-14

我怀疑这是一个定时/延迟问题,但不清楚是否有应用程序操作会强制刷新。“Drive.DriveAPI.RequestSync(GAC)”似乎没有影响。

共有1个答案

韦胜泫
2023-03-14

更新(07/22/2015)
多亏了Steven Bazyl的迅速响应(见下面的评论),我终于有了一个使用完成事件的令人满意的解决方案。下面是两个简化的代码片段,在新创建的文件传播到驱动器时,它们将ResourceId传递到应用程序:

文件创建,添加更改订阅:

public class CreateEmptyFileActivity extends BaseDemoActivity {
  private static final String TAG = "_X_";

  @Override
  public void onConnected(Bundle connectionHint) {   super.onConnected(connectionHint);

    MetadataChangeSet meta = new MetadataChangeSet.Builder()
      .setTitle("EmptyFile.txt").setMimeType("text/plain")
      .build();

    Drive.DriveApi.getRootFolder(getGoogleApiClient())
      .createFile(getGoogleApiClient(), meta, null,
        new ExecutionOptions.Builder()
          .setNotifyOnCompletion(true)
          .build()
      )
      .setResultCallback(new ResultCallback<DriveFileResult>() {
        @Override
        public void onResult(DriveFileResult result) {
          if (result.getStatus().isSuccess()) {
            DriveId driveId = result.getDriveFile().getDriveId();
            Log.d(TAG, "Created a empty file: " + driveId);
            DriveFile file = Drive.DriveApi.getFile(getGoogleApiClient(), driveId);
            file.addChangeSubscription(getGoogleApiClient());
          }
        }
      });
  }
}

事件服务,捕获完成:

public class ChngeSvc extends DriveEventService {
  private static final String TAG = "_X_";

  @Override
  public void onCompletion(CompletionEvent event) {  super.onCompletion(event);
    DriveId driveId = event.getDriveId();
    Log.d(TAG, "onComplete: " + driveId.getResourceId());
    switch (event.getStatus()) {
      case CompletionEvent.STATUS_CONFLICT:  Log.d(TAG, "STATUS_CONFLICT"); event.dismiss(); break;
      case CompletionEvent.STATUS_FAILURE:   Log.d(TAG, "STATUS_FAILURE");  event.dismiss(); break;
      case CompletionEvent.STATUS_SUCCESS:   Log.d(TAG, "STATUS_SUCCESS "); event.dismiss(); break;
    }
  }
}
20:40:53.247﹕Created a empty file: DriveId:CAESABiiAiDGsfO61VMoAA==
20:40:54.305: onComplete, ResourceId: 0BxOS7mTBMR_bMHZRUjJ5NU1ZOWs

最初,我实现了Cheryl Simon的建议,并在新创建的文件上添加了一个ChangeListener,希望在文件传播时获得ResourceID。使用android-demos中的经典CreateEmptyFileActivity,我将以下测试代码拼凑在一起:

public class CreateEmptyFileActivity extends BaseDemoActivity {
  private static final String TAG = "CreateEmptyFileActivity";

  final private ChangeListener mChgeLstnr = new ChangeListener() {
    @Override
    public void onChange(ChangeEvent event) {
      Log.d(TAG, "event: " + event + " resId: " + event.getDriveId().getResourceId());
    }
  };


  @Override
  public void onConnected(Bundle connectionHint) {   super.onConnected(connectionHint);

    MetadataChangeSet meta = new MetadataChangeSet.Builder()
      .setTitle("EmptyFile.txt").setMimeType("text/plain")
      .build();

    Drive.DriveApi.getRootFolder(getGoogleApiClient())
      .createFile(getGoogleApiClient(), meta, null)
      .setResultCallback(new ResultCallback<DriveFileResult>() {
        @Override
        public void onResult(DriveFileResult result) {
          if (result.getStatus().isSuccess()) {
            DriveId driveId = result.getDriveFile().getDriveId();
            Log.d(TAG, "Created a empty file: " + driveId);
            Drive.DriveApi.getFile(getGoogleApiClient(), driveId).addChangeListener(getGoogleApiClient(), mChgeLstnr);
          }
        }
      });
  }
}

...一直在等着什么事情发生。文件在几秒钟内被愉快地上传到驱动器上,但没有onChange()事件。10分钟,20分钟……我找不到任何方法让ChangeListener醒来。

所以我能想出的唯一的解决方案是轻推GDAA。因此,我实现了一个简单的处理程序--扑克,它在发生某些事情之前一直让元数据发痒:

public class CreateEmptyFileActivity extends BaseDemoActivity {
  private static final String TAG = "CreateEmptyFileActivity";

  final private ChangeListener mChgeLstnr = new ChangeListener() {
    @Override
    public void onChange(ChangeEvent event) {
      Log.d(TAG, "event: " + event + " resId: " + event.getDriveId().getResourceId());
    }
  };

  static DriveId driveId;
  private static final int ENOUGH = 4;    // nudge 4x,  1+2+3+4 = 10seconds
  private static int mWait = 1000;
  private int mCnt;
  private Handler mPoker;
  private final Runnable mPoke = new Runnable() { public void run() {
    if (mPoker != null && driveId != null && driveId.getResourceId() == null && (mCnt++ < ENOUGH)) {
      MetadataChangeSet meta = new MetadataChangeSet.Builder().build();
      Drive.DriveApi.getFile(getGoogleApiClient(), driveId).updateMetadata(getGoogleApiClient(), meta).setResultCallback(
        new ResultCallback<DriveResource.MetadataResult>() {
          @Override
          public void onResult(DriveResource.MetadataResult result) {
            if (result.getStatus().isSuccess() && result.getMetadata().getDriveId().getResourceId() != null)
              Log.d(TAG, "resId COOL " + result.getMetadata().getDriveId().getResourceId());
            else
              mPoker.postDelayed(mPoke, mWait *= 2);
          }
        }
      );
    } else {
      mPoker = null;
    }
  }};

  @Override
  public void onConnected(Bundle connectionHint) {   super.onConnected(connectionHint);

    MetadataChangeSet meta = new MetadataChangeSet.Builder()
      .setTitle("EmptyFile.txt").setMimeType("text/plain")
      .build();

    Drive.DriveApi.getRootFolder(getGoogleApiClient())
      .createFile(getGoogleApiClient(), meta, null)
      .setResultCallback(new ResultCallback<DriveFileResult>() {
        @Override
        public void onResult(DriveFileResult result) {
          if (result.getStatus().isSuccess()) {
            driveId = result.getDriveFile().getDriveId();
            Log.d(TAG, "Created a empty file: " + driveId);
            Drive.DriveApi.getFile(getGoogleApiClient(), driveId).addChangeListener(getGoogleApiClient(), mChgeLstnr);

            mCnt = 0;
            mPoker = new Handler();
            mPoker.postDelayed(mPoke, mWait);
          }
        }
      });
  }
}
 类似资料:
  • 问题内容: 我知道双重价值的内部代表是这样的。但是下面的代码仍然让我感到困惑。 码: 输出: 到底是怎么回事?加法,乘法进行得很好,但减法,除法则不好。谁能解释一下 加法为何与减法不同 ? 问题答案: 简短的答案是,对于浮点运算,您存在表示错误和舍入错误。在“知道”表示错误,所以如果没有舍入误差,你看不到它。但是,如果舍入误差太大,则可以。 解决方案是使用BigDecimal或舍入结果。 如果使用

  • 编辑:我的困惑出现了,因为通过预测哪个分支,你肯定也在有效地进行目标预测?? 这个问题与我关于这个主题的第一个问题有内在联系: 分支预测与分支目标预测 无限循环 语句 或语句 语句的“then”子句结尾(跳过子句) 非虚函数调用 从函数返回 虚函数调用 函数指针调用 语句(如果编译为跳转表) 语句 语句(如果编译成一系列语句) 循环条件测试 和运算符 三元运算符 null 如果我有以下代码: (B

  • 问题内容: 根据Microsoft在上的文档,NEWSEQUENTIALID的输出是可预测的。但是可预测性如何呢?假设我有一个GUID,该GUID是由生成的,要执行以下操作会有多困难: 计算下一个值? 计算先前的值? 计算第一个值? 即使根本不知道任何GUID,也要计算第一个值? 计算行数?例如,当使用整数时,告诉我应用程序中有842个订单。 以下是有关我在做什么以及各种折衷方法的一些背景信息。

  • 我正在构建一个模块化Web应用程序,其中包含一些打包在jar依赖项(不同模块)中的Spring组件。此jar还包含一些JSP资源,例如: 现在,我想在应用程序中使用以下结构重写特定的JSP。 使用tomcat7:run运行应用程序时,有时会显示覆盖的菜单。但任何后续运行都将以旧运行结束。 使用tomcat7运行:run war更有希望。大多数运行新菜单。显示jsp。但当将应用程序部署到另一个Tom

  • 我正在尝试对我的软件的GUI进行一些自动测试,并验证一些需要比较导出文件的东西,因为我在命令行中使用了fc。 我需要我的程序和cmd的句柄才能在它们之间切换。不幸的是,Sikuli在调用时表现得非常不可预测 有时它会打开一个新的控制台,有时它会专注于已经从sikuli IDE打开的控制台。 有没有更智能、更健壮的方法来使用控制台和sikuli?

  • 分支预测已经在StackOverflow上讨论了几次。然而,我并没有具体找到我所寻找的答案 在优化阶段,我需要避免分支预测失误。我需要做一些验证。它看起来像: 当然,在正常的预期工作流中(大多数情况下都会发生),我们不会抛出异常,因此我们不会输入if。 我知道在常见的if/else范式中,我们可以通过将最可能的分支放在if中,将可能性较小的分支放在else中来提示编译器(可移植分支预测提示)。但是