gpt4 book ai didi

google-drive-android-api - Google Drive Android API 中 DriveId.getResourceId() 的不可预测结果

转载 作者:行者123 更新时间:2023-12-04 09:14:48 25 4
gpt4 key购买 nike

问题是“DriveId.getResourceId()”中的“resourceID”在新创建的文件(“DriveFolder.createFile(GAC, meta, cont)”的产物)上不可用(返回NULL)。如果通过常规列表或查询过程检索文件,则“resourceID”是正确的。

我怀疑这是一个时间/延迟问题,但不清楚是否有强制刷新的应用程序操作。 'Drive.DriveApi.requestSync(GAC)' 似乎没有效果。

最佳答案

更新 (07/22/2015)
感谢 Steven Bazyl 的及时回复(见下面的评论),我终于使用 Completion Events 得到了一个令人满意的解决方案。 .下面是两个缩小的代码片段,它们在新创建的文件传播到 Drive 后立即将 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;
}
}
}

在正常情况下(wifi),我几乎立即获得了 ResourceId。
20:40:53.247﹕Created a empty file: DriveId:CAESABiiAiDGsfO61VMoAA==
20:40:54.305: onComplete, ResourceId: 0BxOS7mTBMR_bMHZRUjJ5NU1ZOWs

……暂时完成。

原始帖子,已弃用,留在这里以供引用。

我让这个答案坐了一年希望 GDAA将开发一个有效的解决方案。我唠叨的原因很简单。如果我的应用程序创建了一个文件,它需要使用一个有意义的 ID(即 ResourceId)将此事实广播给它的伙伴(例如其他设备)。在 REST下是一件小事成功创建文件后,ResourceId 立即返回的 Api。

不用说,我理解 GDAA 的理念,即保护应用程序免受网络原语、缓存、批处理等的影响……但很明显,在这种情况下,ResourceID 在交付给应用程序之前很久就可用了。

最初,我实现了 Cheryl Simon 的建议,并在新创建的文件上添加了一个 ChangeListener,希望在文件传播时获取 ResourceID。使用经典 CreateEmptyFileActivity在 android-demos 中,我拼凑了以下测试代码:
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);
}
}
});
}
}

......并且正在等待某事发生。文件被愉快地上传到 Drive在几秒钟内,但没有 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);
}
}
});
}
}

瞧,4 秒后(给予或接受),ChangeListener 提供了一个新的 Shiny 的 ResourceId。当然,ChangeListener 就这样过时了,因为扑克例程也获得了 ResourceId。

所以这就是那些不能等待 ResourceId 的人的答案。这带来了后续问题:

为什么我必须修改元数据(或重新提交内容),很可能会创建不必要的网络流量,以获取 onChange() 事件,当我清楚地看到该文件已在很久以前传播并且 GDAA 有可用的 ResourceId 时?

关于google-drive-android-api - Google Drive Android API 中 DriveId.getResourceId() 的不可预测结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22874657/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com