【问题标题】:Android Google Play / Drive ApiAndroid 谷歌播放/云端硬盘 API
【发布时间】:2015-07-03 09:27:06
【问题描述】:

您好,我正在使用 Google Drive Api 通过 AppDataFolder 工具存储数据库。我有一个测试应用程序在一台设备上成功运行。我能够上传/更新/删除/下载数据库文件并将其重新集成到程序中,没有任何问题。

我遇到的问题是,当我想与运行相同应用程序的另一台设备共享此数据库时,事情并没有按预期工作。示例设备 A 我上传数据库,设备 B - 我想下载数据库但没有找到文件(这种延迟可能会从几秒到几小时变化很大)。原因 - 使用 Api 时,它决定何时“同步”数据,因为它是排队的,而不是即时上传的。因此,当在一台设备上使用时,这不是问题,因为它要么从云存储中获取“同步”文件,要么获取等待同步的文件。

我已经尝试了各种方法,例如在发出更新/删除请求之前尝试列出所有 AppDataFolder 文件或通过带有可搜索过滤器的查询检索元数据等。但是我无法让它从根本上按照它选择的时间工作同步。

所以我的实际问题是:如何强制 Google Drive 在我想要的时候同步我的文件,即每次发出请求时,以便使用同一个应用程序在多个设备之间实现同步。必须有一个答案,因为我认为这是您首先使用 AppDataFolder 的根本原因。

提前致谢

编辑/更新:

我已经能够在 Api 中找到使用此代码“同步”驱动器内容的选项:

            // try to sync
            Drive.DriveApi.requestSync(mGoogleApiClient).setResultCallback(new ResultCallback<com.google.android.gms.common.api.Status>() {
                @Override
                public void onResult(com.google.android.gms.common.api.Status status) {
                    if (!status.getStatus().isSuccess()) {
                        Log.e("SYNCING", "ERROR" + status.getStatusMessage());
                    } else {
                        Log.e("SYNCING", "SUCCESS");
                        // execute async task to list AppFolderContents
                        new AppFolderContentsAsyncTask(getActivity()).execute();
                    }
                }
            });

这适用于快速连续 3/4 次尝试,但是我达到了同步限制和状态消息:

已超出 ERRORSync 请求速率限制。

有什么方法可以提高请求率,因为如果我必须有一个应用程序提示用户“请稍后再试以同步 - 不确定你需要等多久才能同步”不过!'

解决方案 - 各种,以及我的想法(其价值)

我想要的解决方案(在向应用开发者发送电子邮件后,该开发者发布了一个同步没有问题的驱动器应用程序)是使用 Drive REST Api,而不是更新的(和 Google 首选的)Drive API。我尝试将“requestSync”限制为仅当用户使用 Drive 选项导航到片段时(而不是每个文件事务)。然而,这可能会在很大程度上解决 requestSync 速率限制,但它仍然可能达到该限制。此外,如果多个设备正在运行该应用程序,并且链接到同一个云端硬盘帐户同时在应用程序中同步/上传/删除文件,则可能会失去同步 - 这可能是一种罕见的情况,但仍有可能。就用户体验或应用设计而言,我不认为让用户等待同步文件是一个可行的选择。

但很好奇 - 实际的云端硬盘应用可让您根据需要多次刷新(requestSync?)。我在 Web 界面上快速连续创建了 20 个文件夹,创建每个文件夹后,我刷新了手机上的 Drive 应用程序,它同步了所有 20 次。谷歌似乎了解同步的重要性,但选择在他们的新 Drive API 中确保这一点变得相当困难。如前所述,将文件上传到云存储通常会立即发生(它是排队的,但是如果您有连接,它几乎会立即发生)。我原以为这是移动数据/更新驱动器内容方面的昂贵交易,而不仅仅是查询文件同步。但是,您可以一次一个地将文件添加到您的驱动器应用程序,并且它几乎立即一次上传一个文件 - 当您在 30 秒内请求同步超过 4 次然后它失败并且您必须“冷静下来” ' 一会儿。

总的来说,我对编程/Android 很陌生 - 一旦我学到新东西,我就会意识到我实际上知道的很少,所以如果他们是使用 Drive API(而不是 REST API)的更好解决方案的话我非常欢迎它。

【问题讨论】:

  • 嗨,实际上我们遇到了不同的情况。旧的 REST API 在 Android 6 中需要运行时 GET_ACCOUNTS 权限 - stackoverflow.com/q/34639890/72437 我们正在从 REST API 转移到 google-drive-android-api。但是,目前面临与您相同的问题...
  • @Cheok Yan Cheng 我使用这个的项目我现在搁置了,只是因为我想学习和获得更多的一般经验,而不是陷入 API 的微妙之处.我想不出一个简单的解决方案,可以在不达到“同步限制”的情况下快速连续发生多设备同步。我的应用程序中的“同步按钮”在按下后会在 30 秒内处于非活动状态,从而阻止进一步同步以避免限制,或者“待定”同步等待以避免限制。有趣的是,Drive 应用程序可以随心所欲地同步!
  • 我可以知道您点击 requestSync 的速度有多快吗?您还记得,您每分钟发出多少次请求以达到配额?
  • 从内存中我调用了 requestSync 3,可能 4 次(每 7-8 秒一次)然后我会达到极限(在用例场景中这很容易发生),并且必须等待几个requestSync 再次成功前大约几分钟。您可以实现指数冷却等待时间 - 这显然会起作用,但这会导致在使用相同帐户登录运行应用程序的多个设备之间发生同步延迟。在我看来,它们是硬编码到 Drive API 中的。我找不到任何关于同步配额、同步请求频率或冷静期的文档

标签: android google-api google-drive-api google-drive-android-api


【解决方案1】:

DriveApi#requestSync 将允许您从服务器请求“同步”到设备。这样,在第二台设备上,您应该能够看到从第一台设备上传的内容。但是,请求同步的调用受到速率限制(每个设备),以避免滥用并保证 Drive API 使用合理数量的数据。理想情况下,您应该只在需要时才调用请求同步。没有办法提高速率限制。

关于上传完成,在提交上传后,您不应该使用请求同步,因为这对您没有帮助(它只会向下同步而不是向上同步)。实际上传将尽快进行(基于设备的连接性以及您的应用通过DrivePreferencesApi 指定的首选项,默认情况下不受限制)。

如果您想知道实际上传发生的时间,您可以使用CompletionEvents。通过这种方式,您可以更深入地了解实际情况来测试您的应用。

【讨论】:

  • 谢谢,非常有用的信息 - 我已经找到了几种方法可以解决这个问题,我正在研究你上面提到的几点。
  • @MarkKeen 你介意分享一下那些路线,你最后做了什么吗?
  • @sorianiv - 请参阅原始问题中的编辑 - 一种解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多