JobIntentService для загрузки изображений - PullRequest
0 голосов
/ 10 мая 2019

Я использовал timertask для загрузки изображений на s3, но теперь столкнулся с проблемой на устройствах Oreo + из-за ограничения фонового процесса.

Теперь я перенес свой код в JobIntentService.

Я написал S3UploadService, который унаследован от JobIntentService, основная цель службы - загрузить изображение в корзину s3.

Я использую TransferUtility для загрузки.Уничтожение службы вызывается до завершения загрузки службы, так как TransferUtility выполняет асинхронные задачи.

build.gradle Зависимость

api 'com.amazonaws:aws-android-sdk-s3:2.2.+'

public class S3UploadService extends JobIntentService {

    public static void enqueueWork(Context context, Intent work) {
        enqueueWork(context, S3UploadService.class, S3_UPLOAD_SERVICE_JOBID, work);
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(S3_UPLOADSERVICE_LOG_TAG, "S3UploadService - onCreate");
    }

    @Override
    protected void onHandleWork(@NonNull Intent intent) {
        Log.d(S3_UPLOADSERVICE_LOG_TAG, "S3UploadService - onHandleWork start");

        RequestProcessor requestProcessor = new RequestProcessor(this);
        requestProcessor.sendS3ContentRequest();

        Log.d(S3_UPLOADSERVICE_LOG_TAG, "S3UploadService - onHandleWork finish");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d(S3_UPLOADSERVICE_LOG_TAG, "S3UploadService - onDestroy");
    }
}

public class RequestProcessor {

    public void sendS3ContentRequest() {
        TransferObserver transferObserver = transferUtility.upload(Utility.getValue(context, "bucket")  "/"  additionalBucket, fileName,                file, om,CannedAccessControlList.PublicRead);
                s3ObserverMap.put(transferObserver.getId(), fileInfo.getFileName());

                transferObserver.setTransferListener(new TransferListener(){
                    @Override
                    public void onStateChanged(int id, TransferState state) {

                                // do something
                                switch (state) {
                                    case COMPLETED:
                                        Intent intent = new Intent("s3-upload");
                                        intent.putExtra("filename",filename);
                                        LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
                                        break;



                                    case CANCELED:
                                    case FAILED:

                                        break;

                                }
                            }
                        }
                        Log.i("info", "onStatechanged  "  id  " state "  state.name());
                    }

   }
}

Есть ли способ / флаг для вызова асинхронных заданий / задач из службы onHandleWork?и уничтожить вызовет после завершения задания.

...