android - tag - Programar el trabajo recurrente usando el despachador de trabajos de firebase
tag manager developers (3)
Hay algunas razones por las que esto podría estar sucediendo. En primer lugar, ¿su trabajo es false
en onStopJob()
? De los documentos
@Override
public boolean onStopJob(JobParameters job) {
return false; // Answers the question: "Should this job be retried?"
}
Si el trabajo necesita ser reintentado, se aplicará la reducción. Combine esto con el hecho de que desea que se ejecute nuevamente cada 10-20 segundos para que pueda obtener los resultados que está experimentando.
No ha establecido ninguna restricción para el trabajo, que también afectará cuándo se ejecutará. p.ej
.setConstraints( // only run on an unmetered network Constraint.ON_UNMETERED_NETWORK, // only run when the device is charging Constraint.DEVICE_CHARGING )
Además, no utilizaría un trabajo programado para lo que estás haciendo. Mire el cliente API de Google que ofrece actualizaciones periódicas del proveedor de ubicación fusionada .
Puede implementar una devolución de llamada en su Servicio o Actividad como tal
public class MainActivity extends ActionBarActivity implements
ConnectionCallbacks, OnConnectionFailedListener, LocationListener {
...
@Override
public void onLocationChanged(Location location) {
mCurrentLocation = location;
mLastUpdateTime = DateFormat.getTimeInstance().format(new Date());
updateUI();
}
private void updateUI() {
mLatitudeTextView.setText(String.valueOf(mCurrentLocation.getLatitude()));
mLongitudeTextView.setText(String.valueOf(mCurrentLocation.getLongitude()));
mLastUpdateTimeTextView.setText(mLastUpdateTime);
}
}
Consulte los documentos completos aquí, pero creo que tendrá una experiencia más consistente con los servicios dedicados a lo que está tratando de lograr.
https://developer.android.com/training/location/receive-location-updates.html
Estoy tratando de publicar la ubicación del dispositivo Android en el servidor cada 10 minutos. Estoy usando el despachador de trabajos de firebase para hacer esto
FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(this));
Job myJob = dispatcher.newJobBuilder()
.setService(UpdateLocationService.class)
.setRecurring(true)
.setTrigger(Trigger.executionWindow(10, 20))
.setRetryStrategy(RetryStrategy.DEFAULT_LINEAR)
.setTag("location-update-job")
.setLifetime(Lifetime.FOREVER)
.build();
dispatcher.mustSchedule(myJob);
UpdateLocationService
obtiene la ubicación y lo envía al servidor.
Mi problema: las cosas en general funcionan bien. Lo único es que los trabajos se están programando con una diferencia de 4 m, 6 m, 7 m, 8 m, 10 m, 16 m, 23 m ...
¿Alguien puede por favor ayudarme a entender continuar?
Actualización: quiero la ubicación una vez en 10-20 minutos. En el código anterior, el valor es demasiado bajo solo para fines de prueba
ExecutionWindow especifica la hora aproximada. No se garantiza que el trabajo se ejecutará en la ventana dada. Si se pierde la ventana, el trabajo se ejecutará lo más pronto posible en circunstancias ideales. Para los trabajos recurrentes una vez que el trabajo haya finalizado, el próximo trabajo calculará el tiempo de ejecución de la ventana a partir del momento en que se ejecutó por última vez.
ExecutionWindow representa un desencadenador de trabajo que se vuelve elegible una vez que el tiempo transcurrido actual excede el tiempo programado + el valor de {@code windowStart}. Se recomienda al programador backend usar el valor windowEnd como una señal de que el trabajo debe ejecutarse, pero esto no es un comportamiento forzado.
También el:
Trigger.executionWindow(windowStart, windowEnd)
espera que la windowStart
y windowEnd
en segundos. Según su requisito, desea que la ventana sea de 10 minutos. Entonces deberías usar algo como:
Trigger.executionWindow(10*60, 20*60)