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

标签 android multithreading amazon-s3 android-workmanager

我正在使用 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/

相关文章:

android - 将按钮添加到 android 操作栏

java - Oracle Form 频繁挂起

ios - 通过 CloudFront (Amazon) 下载图像

java - 两个线程写入同一个 JTextArea

Ruby - 多线程 TCP 消息

android - 将图像从图库上传到 S3 AWS android

java - 从 Java 中的 Amazon s3 中删除对象列表

更新应用程序后Android服务停止

android - 以编程方式崩溃后重启应用程序 - Android

android - SignalR 与 Google Cloud 消息传递与 Parse