Допустим, мы разрабатываем приложение для обмена сообщениями, в котором мы хотим отправлять сообщения в данные разговоры, где порядок этих сообщений важен только в этом разговоре, и если приложение переводится в фоновый режим, мы хотим гарантировать, что сообщениебудет отправлено.
Метод WorkManager#beginUniqueWork
кажется идеальным для этого, где uniqueWorkName
будет некоторым идентификатором диалога, а ExistingWorkPolicy.APPEND
будет использоваться в качестве рабочей политики, чтобы сохранить работу в запланированном порядке.
Пока в моем приложении, пока каждая часть Работы возвращает Result.SUCCESS
, любая будущая запланированная работа будет выполняться, как ожидается.Однако, если одно конкретное сообщение не может быть отправлено фатальным способом, и я возвращаю Result.FAILURE
, тогда вся дальнейшая работа с тем же идентификатором диалога никогда не достигнет моей реализации Worker#doWork()
.
После просмотра исходного кода класса EnqueueRunnable
это кажется очень осознанным выбором.Что я не могу понять, так это почему?Кажется странным, что если uniqueWorkName
терпит неудачу, то это имя становится непригодным для остальной части жизни приложения (это сохраняется при уничтожении приложения).
Кроме того, я хотел бы знать, если кто-нибудьимеет хорошее решение для этого, или знает, изменится ли это в будущих версиях WorkManager
.Пока что самое лучшее, что я могу придумать, это вернуть Result.SUCCESS
, но закодировать мое собственное состояние отказа в выходных данных Data
, чтобы все наблюдатели работы знали, что это не удалось.Это, однако, немного неловко и не очень очевидно для будущих сопровождающих кода (и может быть немного запутанным при просмотре журналов для данного фрагмента Work
).
Возможно, мое предполагаемое использование уникальной работы совершенно неверно, и есть лучшее решение там.Любые идеи будут с благодарностью, спасибо!