我已经实施了AWS核心和S3 SDK来处理文件上传。不幸的是,有时上传工作不正常。 (它似乎只是在wifi连接下,但我不是100%肯定这个事实)
由于某些未知原因,即使文件尚未完成上传,aws服务也会收到成功的响应,然后一切都会挂起。
我可以看到传输服务已启动,例如第一个文件开始正常上传并完成但第二个文件从未完成上传,TransferService静默停止,而我没有通过传输监听器收到任何错误...我&#39 ;已启用aws的调试日志,以查看是否可以通过
获取更多信息 java.util.logging.Logger.getLogger("com.amazonaws").setLevel(java.util.logging.Level.FINEST);
这是一个上传日志,第一个文件上传成功,第二个文件失败 - 我只是在第一个文件通知完成时启动下一个文件。 (没有包名和时间戳以便于分析):
D/AwsUploadManager: Uploading file: /storage/emulated/0/folder/profile20160219_123233.jpg
D/AwsUploadManager: Uploading under key: 56cb00d2121bbfcc0e8c68e7-843f1417-3f44-4d76-915d-f3a72c56a7d4
D/AwsUploadManager: AwsUploadManager 56cb00d2121bbfcc0e8c68e7-843f1417-3f44-4d76-915d-f3a72c56a7d4
D/TransferSerivce: Starting Transfer Service
D/TransferSerivce: Loading transfers from database
D/TransferSerivce: 1 transfers are loaded from database
W/TransferSerivce: Transfer has already been added: 6
D/TransferSerivce: Network connected: true
D/AwsUploadManager: onStateChanged IN_PROGRESS
D/AwsUploadManager: onProgressChanged id= 6 ::bytesCurrent0 bytesTotal16917
D/com.amazonaws.request: Sending Request: PUT.........
D/libc: [NET] android_getaddrinfofornet+,hn 41(0x6369616f2d696d),sn(),hints(known),family 0,flags 4
D/libc: [NET] android_getaddrinfofornet-, err=8
D/libc: [NET] android_getaddrinfofornet+,hn 41(0x6369616f2d696d),sn(),hints(known),family 0,flags 1024
D/libc: [NET] android_getaddrinfofornet-, pass to proxy
D/libc: [NET] android_getaddrinfo_proxy+
D/libc: [NET] android_getaddrinfo_proxy get netid:0
D/libc: [NET] android_getaddrinfo_proxy-, success
D/AwsUploadManager: onProgressChanged id= 6 ::bytesCurrent16917 bytesTotal16917
D/com.amazonaws.request: Received successful response: 200, AWS Request ID: 85952ED0E0FCF444
D/AwsUploadManager: onProgressChanged id= 6 ::bytesCurrent16917 bytesTotal16917
D/AwsUploadManager: onStateChanged COMPLETED
D/AwsUploadManager: Upload finished: 56cb00d2121bbfcc0e8c68e7-843f1417-3f44-4d76-915d-f3a72c56a7d4
D/AwsUploadManager: Uploaded url: https://server-name.s3.eu-central-1.amazonaws.com/56cb00d2121bbfcc0e8c68e7-843f1417-3f44-4d76-915d-f3a72c56a7d4
D/AwsUploadManager: Uploading file: /storage/emulated/0/folder/profile20160219_122512.jpg
D/AwsUploadManager: Uploading under key: 56cb00d2121bbfcc0e8c68e7-7ea27f9e-0e48-4fde-81a1-7d72383ada2d
D/AwsUploadManager: AwsUploadManager 56cb00d2121bbfcc0e8c68e7-7ea27f9e-0e48-4fde-81a1-7d72383ada2d
D/AwsUploadManager: onStateChanged IN_PROGRESS
D/AwsUploadManager: onProgressChanged id= 7 ::bytesCurrent0 bytesTotal1930575
D/com.amazonaws.request: Sending Request: PUT https://server-name.s3.eu-central-1.amazonaws.com /56cb00d2121bbfcc0e8c68e7-7ea27f9e-0e48-4fde-81a1-7d72383ada2d Headers: (x-amz-decoded-content-length: 1930575, Content-MD5....
D/AwsUploadManager: onProgressChanged id= 7 ::bytesCurrent655360 bytesTotal1930575
D/AwsUploadManager: onProgressChanged id= 7 ::bytesCurrent1048576 bytesTotal1930575
D/AwsUploadManager: onProgressChanged id= 7 ::bytesCurrent1310720 bytesTotal1930575
D/AwsUploadManager: onProgressChanged id= 7 ::bytesCurrent1703936 bytesTotal1930575
D/com.amazonaws.request: Received successful response: 200, AWS Request ID: DE9670A8450D4BAB
**D/TransferSerivce: Stop self** --And here amazon stopped self without notifying registered listeners about transfer..
用于调用上传的代码:
TransferObserver transferObserver = mTransferUtility.upload(BUCKET_NAME, fileKey, file);
transferObserver.setTransferListener(new TransferListener() {...}
除了我使用标准的auth方法和pub / sec密钥凭证而不是Cognito pool之外,所有内容都是样本的标准。
mAwsCredentials = new BasicAWSCredentials(mContext.getString(R.string.aws_accress_key), context.getString(R.string.aws_secret_key));
mAmazonS3Client = new AmazonS3Client(mAwsCredentials);
mAmazonS3Client.setRegion(com.amazonaws.regions.Region.getRegion(REGION));
mTransferUtility = new TransferUtility(mAmazonS3Client, mContext);
顺便说一下,这个问题有时会发生在第三次上传的第一个文件上,它与我尝试上传的文件数无关。有时onProgressChanged在上传挂起之前只触发一次,我可以看到收到成功的响应和之后的Stop Self。
问题: 以前有没有人遇到过此问题,有什么可能与之相关?我经常遇到这种情况(每隔一次),因此不确定它的网络是否相关。即使它是,我期待亚马逊正确处理网络错误或至少通知已注册的听众。此外,我已经浏览了一些源代码,并且他们的文档感觉他们正在正确处理网络问题,所以我正在跳跃,我正在做一些非常错误的事情。
答案 0 :(得分:3)
最近的v2.2.12更改只保留了已注册转移侦听器的弱引用。用户有责任保留转移监听器,直到转移完成。目的是防止内存泄漏。但是它的用法没有明确记录。我们计划在将来的版本中调整它。请继续关注。