代码之家  ›  专栏  ›  技术社区  ›  Usman Rana

Amazon S3 TransferUtility在应用程序关闭时停止,即使在WorkManager中也是如此

  •  1
  • Usman Rana  · 技术社区  · 6 年前

    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;
                    }
                }
            });
        }
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   Kaveri    6 年前

    不使用工作经理,不同的方法,但完成相同的任务。 我在我的一个应用程序中有一个类似的要求,我所做的是,上传代码是在一个intent服务中编写的,该服务计划在将来的某个时间执行(为此使用jobscheduler),即使在应用程序关闭和打开时,上传也能工作。