经过大量测试后,我断定AWS API不允许您停止正在传输过程中的上传。
使用低级别和高级别(TransferManager)上传时可用的abortMultipartUploads()和abortMultipartUpload()方法不按照名称的含义进行:这些方法的作用是禁止进一步上传的部分内容是从启动的,但只有当部分内容已经完成上传时。它们在转移过程中并不实际中止上传。
提供了两种方法,它们应该立即停止上传(shutdown()和shutdownNow()),但这些方法在启动后似乎对正在进行的传输没有任何影响。
如果使用底层分段上传方法,则可以暂停和恢复上传,但没有实际的方法来阻止它。暂停只会在最后一部分完成传输时停止上传顺序,但是此传输至少为5Mb,因此如果您的数据连接速度较慢,则此5Mb可能需要一段时间才能实际暂停。
我怀疑AWS提供的API主要是为企业用户的专业服务器应用程序设计的,并且仅仅为口碑不佳的移动应用程序使用。这可能是AWS故意采取的一个步骤,不允许转移被终止。
无论发生什么情况,我发现只有一种方法可以在转移开始后停止转移。我期望有些人会抗议使用这种方法,但在AWS为Android提供更好的API之前,我坚持使用它:
我使用TransferManager(Android示例here)启动上传,然后使用线程跟踪进度,通过处理程序更新进度栏。
在决定取消的时候,我关闭了所有正在运行的线程和进度条。TransferManager是无视这一切,并在它自己的线程转移,你不能直接停止进行,所以下一步是调用:
finish();
依次为:
System.exit(0);
或者:
Process.killProcess(Process.myPid());
这会导致Android转储回调用Activity,并强制清理当前正在使用的所有资源。最重要的是,它会对传输管理器使用的资源拉动插头,从而导致传输立即停止。如果您认为上传的任何部分已经完成,您可能仍然需要在同一个存储桶上调用abortMultipartUploads()或abortMultipartUpload(),以便让AWS清除部分上传内容,否则您可能仍在为该上传付费部分。
这不是很漂亮,我更喜欢使用正确的关闭方法,但在AWS提供了一种方法来做到这一点之前,这是我发现调用正在进行的转移的完全暂停的唯一方式。
希望这可以帮助有人面临同样的问题。
好的,在大量使用Google搜索,在多个论坛上发布问题以及尝试AWS SDK之后,我终于得到了答案 - 它在Android上受到支持,并且无法正确取消正在进行的转帐 - 无论如何都不是优雅。我会发布一个完整的答案,我自己的问题是几天... – DDSports