Уточнение setUpdateCurrent на OneOffTask

Я пытаюсь понять поведение setTag и setUpdateCurrent OneoffTask в инструменте GcmNetworkManager.
В документации setUpdateCurrent говорится следующее:

Необязательный установщик, чтобы указать, должна ли эта задача переопределять любые ранее существовавшие задачи с тем же тегом. По умолчанию это значение равно false, что означает, что новая задача не будет переопределять существующую.

Достаточно справедливо, но в нем не сказано, что произойдет с задачей, а сказано только одно, что не произойдет, т. е. задача не будет переопределена. :) Мне непонятно, если использование setUpdateCurrent означает, что дублирующиеся задачи разрешены, значит ли это, что они отбрасываются?

Чтобы было ясно, мой вопрос заключается в следующем: Учитывая, что вы использовали setUpdateCurrent(false), когда вы создаете OneoffTask с тем же тегом, что и другая OneoffTask, которая уже запланирована, будет ли выполняться новая задача вдобавок к уже запланированному, или новое задание будет выброшено, отклонено как дубликат?


person Mattias Petter Johansson    schedule 30.12.2015    source источник


Ответы (1)


Учитывая, что вы использовали setUpdateCurrent(false), когда вы создаете OneoffTask с тем же тегом, что и уже запланированная OneoffTask, будет ли по-прежнему выполняться новая задача в дополнение к уже запланированной, или новая задача будет отброшена, отклонена как дубликат?

Новая задача отбрасывается и никогда не планируется. Я был удивлен этим и определенно чувствую, что документация должна была указать это.

Оказывается, вы можете проверить это самостоятельно, используя следующую команду:

adb shell dumpsys activity service GcmService --endpoints YourGcmTaskServiceClassName

Это позволяет вам видеть, сколько задач у вас есть в ожидании среди прочего. Сразу после вызова GcmNetworkManager.getInstance(this).schedule(task) в вашем коде количество задач для вашего пакета будет увеличено в выводе команды adb:

Tasks count by package:
com.mypackage: 1

а под ним находится область, которая показывает ожидающие задачи:

Pending:

(scheduled) endpoint='com.mypackage/com.mypackage.YourGcmTaskServiceClassName'
tag='testing' : [PENDING] u0
Next execution: [early=17s, expires=37s]
Not yet run.

Теперь, если вы попытаетесь запланировать другую задачу с setUpdateCurrent(false) и тем же тегом, что и задача, которая в настоящее время находится в ожидании, вы заметите, что в следующий раз, когда вы запустите команду adb, только одна задача все еще находится в ожидании, и это первая задача, которую вы запланировали.

Если вы укажете setUpdateCurrent(true), одна задача также останется запланированной, но, как и ожидалось, это будет новая задача.

Наконец, если вы укажете задачи с разными тегами и запланируете их, количество задач станет равным двум, и обе задачи будут отложены, что также ожидается.

person George Mulligan    schedule 13.02.2016