Próbuję użyć Menedżera sieci GCM do wysyłania dzienników do usługi backendu. Mamy alarm o każdej godzinie, który tworzy OneoffTask, który po uruchomieniu wywoła usługę backendu z komunikatem dziennika.Menedżer sieci GCM tracąc zadania
To działa, ale bardzo duża ilość zadań jest tracona (o ponad połowę). Na początku myślałem, że ma to coś wspólnego z naszym zapleczem lub siecią, ale po dodaniu mnóstwa rejestrowania plików, okazuje się, że onRunTask w usłudze nigdy nie jest uruchamiany dla tych zadań (ale na pewno planowane są. ? są one utracone jestem nieporozumienie API, czy OneoffTasks prostu nie wiarygodne
ten sposób OneoffTask zaplanowano:
GcmNetworkManager.getInstance(context).schedule(new OneoffTask.Builder()
.setService(AvroLogService.class)
.setExtras(bundle)
// A mandatory tag which identifies the task
// We add a unique hash to the tag to make sure that
// tasks are logged and not thrown away as dupes.
// See: http://stackoverflow.com/q/34528960/304262
.setTag(java.util.UUID.randomUUID().toString())
// Persist to disk, even across boots:
.setPersisted(true)
// Sets a time frame for the execution of this task in seconds.
// This specifically means that the task can either be
// executed right now, or at latest at a certain point:
.setExecutionWindow(0, TWO_WEEKS_IN_SECONDS)
.build());
Znowu nie działa, ale tylko część wiadomości dla. wiadomości, które są następnie utracone, powyższy kod jest definitywnie wykonany (dodałem rejestrowanie plików, aby to zweryfikować), ale nigdy nie ma correspo nding onRunTask wywołany dla utraconych.
I sprawdzeniu, że:
- Oczywisty jest aktualizowany zgodnie z realizacją Menedżer Guide Network (https://developers.google.com/cloud-messaging/network-manager)
- AvroLogService (mój serwis) rozciąga GcmTaskService
- To nadpisuje onRunTask
- Aplikacja ma Uprawnienie RECEIVE_BOOT_COMPLETED.
- AvroLogService NIE nadpisuje onStartCommand.
Zgubiłem się. Czy ktoś może podzielić się spostrzeżeniami na ten temat?
Możesz sprawdzić to [post GitHub] (https://github.com/google/gcm/issues/67), aby uzyskać dodatkowe spostrzeżenia i przykłady użycia 'GcmNetworkManager'. Jeśli tego nie zrobiłeś, wspomniano w poście o potrzebie podania logiki do wykonania zadania wewnątrz 'onRunTask()' i musisz śledzić stan, który jest ci potrzebny do wykonania określonego zadania czego chcesz. – Teyam
Dziękujemy za pomoc, ale ten wpis nie zawiera żadnych istotnych informacji na ten temat. Post mówi o przekazywaniu danych do zadań i korzystam z funkcji setExtras (która wydawała się nie istnieć po napisaniu danego posta), ale nie jest tak istotna dla tego problemu. Problem polega na tym, że kod wewnątrz funkcji onRunTask nie jest wykonywany z przerwami. To znaczy. jest wykonywany wiele razy, ale traci także wiele zadań w kolejce. To tak, jak duży procent zadań jest po prostu tracony i nigdy nie osiąga onRunTask, mimo że są one z powodzeniem umieszczane w kolejce. –