我正在使用 S3 TransferUtility 上传文件,我面临的问题是当应用程序关闭时它会停止上传。我希望它继续在后台运行上传,为此我开始在 WorkManager 中上传,但它仍然完成了上传。问题是什么?以及如何阻止工作管理器发送成功结果,直到 onStatusListener 要求它发送。当前它甚至在文件上传开始之前就立即返回。
public class TestPhotoUploadManager extends BaseWorker {
private FileTransferUtil fileTransferUtil;
@NonNull
@Override
public Result doWork() {
try {
fileTransferUtil = new FileTransferUtil();
String filePath = getExtras().getInputData().getString(CommonTags.URL);
if (filePath != null) {
uploadWithTransferUtility(filePath);
}
return workerResult[0];
} catch (Exception e) {
e.printStackTrace();
setWorkerResult(Result.FAILURE);
return workerResult[0];
}
}
private void uploadWithTransferUtility(String filePath) {
TransferUtility transferUtility = fileTransferUtil.getTransferUtility(getApplicationContext());
String fileName = filePath.substring(filePath.lastIndexOf("/"));
AppLogger.d("usm_s3_file", "name= " + fileName + " ,path= " + filePath);
String folderName = AmazonHelper.BUCKET_NAME;
TransferObserver uploadObserver =
transferUtility.upload(AmazonHelper.BUCKET_NAME, folderName + fileName, new File(filePath));
uploadObserver.setTransferListener(new TransferListener() {
@Override
public void onError(int id, Exception e) {
setWorkerResult(Result.FAILURE);
}
@Override
public void onProgressChanged(int id, long bytesCurrent, long bytesTotal) {
}
@Override
public void onStateChanged(int id, TransferState newState) {
switch (newState) {
case WAITING_FOR_NETWORK:
case PENDING_NETWORK_DISCONNECT:
setWorkerResult(Result.RETRY);
break;
case COMPLETED:
setWorkerResult(Result.SUCCESS);
break;
case WAITING:
case IN_PROGRESS:
break;
default:
setWorkerResult(Result.FAILURE);
break;
}
}
});
}
最佳答案
不使用 work-manager ,不同的方法但完成相同的任务。 我在我的一个应用程序中有类似的要求,我所做的是,上传代码是在一个 Intent 服务中编写的,计划在将来的某个时间执行(为此使用了 jobscheduler),即使应用程序是既封闭又开放。
关于android - Amazon S3 TransferUtility 在应用程序关闭时停止,即使在 WorkManager 中也是如此,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51872906/