我怀疑这是一个定时/延迟问题,但不清楚是否有应用程序操作会强制刷新。“Drive.DriveAPI.RequestSync(GAC)”似乎没有影响。
更新(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中来提示编译器(可移植分支预测提示)。但是