【问题标题】:Amazon S3 TransferUtility stops when application is closed ,even in WorkManagerAmazon S3 TransferUtility 在应用程序关闭时停止,即使在 WorkManager 中也是如此
【发布时间】:2019-01-23 04:03:48
【问题描述】:

我正在使用 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;
                }
            }
        });
    }

【问题讨论】:

    标签: android multithreading amazon-s3 android-workmanager


    【解决方案1】:

    不使用 work-manager ,不同的方法但完成了相同的任务。 我在我的一个应用程序中有类似的要求,我所做的是,上传代码是在意图服务中编写的,计划在将来的某个时间执行(为此使用了作业调度程序),即使在应用程序是关闭和打开。

    【讨论】:

    • WorkManager 自己将任务传递给 Jobscheduler,问题是 WorkManager 不是在等待上传完成或取消,而是在调用上传方法并返回成功。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多