Почему WorkManager не работает правильно с OneTimeWorkRequest?

У меня проблема с WorkManager из компонентов архитектуры Android.

версия workmanager - альфа-06

Может быть, я не понял этот процесс, но я ожидаю, что OneTimeWorkRequest будет работать только один раз, и он будет работать правильно, если время для этой работы не очень большое (не более 7+- минут), но если больше, workmanager запускает ту же работу снова (с тем же UUID) и не прекращайте первую работу, а workmanager выполняет две работы параллельно

Здесь я начинаю работу

Data workDownloadBookData = new Data.Builder().putInt(BookDownloadWork.BOOK_ID_KEY, id).putString(BookDownloadWork.COUNTRY_CODE_KEY, countryCode).build();

    OneTimeWorkRequest request = new OneTimeWorkRequest.Builder(BookDownloadWork.class)
                    .setInputData(workDownloadBookData)
                    .setBackoffCriteria(BackoffPolicy.EXPONENTIAL, 2L, TimeUnit.SECONDS)
                    .build();
WorkManager workManager = WorkManager.getInstance();
if (workManager != null) {
                workManager.beginUniqueWork(countryCode + id,ExistingWorkPolicy.KEEP, request).enqueue();
}

Это моя работа

public class BookDownloadWork extends Worker {

    private static final String TAG = BookDownloadWork.class.getSimpleName();

    public static final String COUNTRY_CODE_KEY = "COUNTRY_CODE_KEY";
    public static final String LAST_UPDATE_KEY = "LAST_UPDATE_KEY";
    public static final String BOOK_ID_KEY = "BOOK_ID_KEY";
    public static final String PHOTO_URI_KEY = "PHOTO_URI_KEY";

    private BookRepository bookRepository;
    private BookLoadProgressDao bookLoadProgressDao;
    private BookLoadWorkerDao bookLoadWorkerDao;
    private NotificationController notificationController;

    @NonNull
    @Override
    public Result doWork() {
        bookRepository = App.appComponent.getBookRepository();
        bookLoadProgressDao = App.appComponent.getBookLoadProgressDao();
        bookLoadWorkerDao = App.appComponent.getBookLoadWorkerDao();
        notificationController = App.appComponent.getNotificationController();

        String countryCode = getInputData().getString(COUNTRY_CODE_KEY);
//        String countryCode = getInputData().getString(COUNTRY_CODE_KEY, "");
        int serverBookId = getInputData().getInt(BOOK_ID_KEY, 0);
        if (!TextUtils.isEmpty(countryCode) && serverBookId != 0) {
            String localBookId = serverBookId + countryCode;
            BookLoadProgress bookLoadProgress = new BookLoadProgress();
            bookLoadProgress.setId(localBookId);
            try {
                LocalBookDetail localBookDetail = bookRepository.selectLocalBookDetailSynch(serverBookId, countryCode);
                bookRepository.saveBookToLocalStorageSynch(serverBookId, localBookDetail.getLastUpdate(), countryCode, null);
                BookLoadWorker bookLoadWorker = new BookLoadWorker();
                bookLoadWorker.setBookId(localBookId);
                bookLoadWorker.setWorkId(getId());
                bookLoadWorkerDao.insertBookLoadWorker(bookLoadWorker);
                RemoteBookChapter[] remoteBookChapters = bookRepository.loadBookFromServerSynch(countryCode, serverBookId);
                if (remoteBookChapters == null) return Result.FAILURE;
                //count max progress
                for (int i = 0; i < remoteBookChapters.length; i++) {
                    RemoteBookChapter remoteBookChapter = remoteBookChapters[i];
                    if (remoteBookChapter.getType().equals("image")) {                     bookLoadProgress.setMaxProgress(bookLoadProgress.getMaxProgress() + 1);
                        for (int j = 0; j < remoteBookChapter.getContent().length; j++) {
                            RemoteBookContent remoteBookContent = remoteBookChapter.getContent()[j];
                            if (remoteBookContent.getType().equals("image")) {
                                bookLoadProgress.setMaxProgress(bookLoadProgress.getMaxProgress() + 1);
                            }

                        }

                    }

                }

                bookLoadProgressDao.insertBookLoadProgress(bookLoadProgress);
                for (int i = 0; i < remoteBookChapters.length; i++) {
                    RemoteBookChapter remoteBookChapter = remoteBookChapters[i];
                    if (remoteBookChapter.getType().equals("image")) {         remoteBookChapter.setUrl(bookRepository.loadAndSaveImageSynch(remoteBookChapter.getUrl()));                   bookLoadProgress.setCurrentProgress(bookLoadProgress.getCurrentProgress() + 1);
         bookLoadProgressDao.insertBookLoadProgress(bookLoadProgress);

                        for (int j = 0; j < remoteBookChapter.getContent().length; j++) {

                            RemoteBookContent remoteBookContent = remoteBookChapter.getContent()[j];

                            if (remoteBookContent.getType().equals("image")) {

                                remoteBookContent.setUrl(bookRepository.loadAndSaveImageSynch(remoteBookContent.getUrl()));                              bookLoadProgress.setCurrentProgress(bookLoadProgress.getCurrentProgress() + 1);                                bookLoadProgressDao.insertBookLoadProgress(bookLoadProgress);

                            }

                        }

                    }

                }
                bookRepository.saveBookToLocalStorageSynch(serverBookId, localBookDetail.getLastUpdate(), countryCode, remoteBookChapters);
                bookLoadProgressDao.deleteBookLoadProgress(bookLoadProgress.getId());

                notificationController.sendNotificationAboutBookDownloadFinished(serverBookId, countryCode);
                return Result.SUCCESS;

            } catch (Exception e) {
                Log.e(TAG, "doWork: ",e );
//                bookLoadProgressDao.deleteBookLoadProgress(bookLoadProgress.getId());
                bookRepository.deleteBookSycnh(localBookId);
                return Result.FAILURE;
            }
        } else {
            return Result.FAILURE;
        }
    }

}

но мне нужна только одна работа для скачивания этих файлов и сохранения их в базе данных

1 ответ

Я думаю, что вы смешиваете несколько концепций. OneTimeWorkRequestСами по себе не уникальны. Если вам нужен только один экземпляр прогона продолжения, вы должны использовать уникальную работу. Посмотрите документацию для beginUniqueWork,