Я использовал 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?и уничтожить вызовет после завершения задания.