3

我在Android上使用Amazon AWS S3 SDK进行视频和数据上传,并且我已经可以正常工作(即,非Multipart)上传,在AsyncTask中运行,因此无法阻止用户界面。是否支持Android的AWS分段上传?

如果我允许用​​户取消上传(无论什么原因),进度条消失,但AsyncTask似乎挂起,直到上传完成。我试着用通常的方法杀死它,但我认为这个问题是由于AWS调用继续上传,即使我试图杀死AsyncTask。

围绕SO和AWS论坛搜索了一下,我认为为了能够取消正在进行的上传,我需要一个MultiPart上传,以允许我在部分上传之间中止上传AsyncTask。问题是,我找不到如何在Android中执行此操作的任何示例,或AWS SDK附带的samples-bundle中的代码示例(我可以找到)。

有没有人知道一个教程,或一个示例项目,我可以从中获得想法,使分段上传工作?我是否需要使用TransferManager来执行此操作?

非常感谢提前!

+0

好的,在大量使用Google搜索,在多个论坛上发布问题以及尝试AWS SDK之后,我终于得到了答案 - 它在Android上受到支持,并且无法正确取消正在进行的转帐 - 无论如何都不是优雅。我会发布一个完整的答案,我自己的问题是几天... – DDSports

回答

2

经过大量测试后,我断定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提供了一种方法来做到这一点之前,这是我发现调用正在进行的转移的完全暂停的唯一方式。

希望这可以帮助有人面临同样的问题。