2016-11-01 16 views
12

Próbuję wysłać lokalizację urządzenia z Androidem do serwera co 10 minut. Używam Firebase dyspozytora pracy to zrobićZaplanuj pracę cykliczną za pomocą dyspozytora zadań Firebase

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 dostaje lokalizację i wysyła do serwera.

Mój problem: sprawy w większości działają dobrze. Tylko, że zadania są planowane z różnicą 4m, 6m, 7m, 8m, 10m, 16m, 23m ...

Czy ktoś może mi pomóc zrozumieć, co się dzieje.

Aktualizacja: chcę raz na lokalizację w 10-20 minut. W powyższym kodzie wartość jest zbyt niska, tylko dla celów testowych:

+1

Jeśli zadanie nie powiedzie się, to wyobrażam sobie, że istnieje wstrzymanie. Sądzę też, że nie ma gwarancji na bieganie w tym momencie. Łączenie czasu zwolnienia ze zmiennym czasem rozpoczęcia będzie uwzględniało czasy. Czy zwróciłeś właściwą wartość logiczną w 'onStopJob()'? –

+0

@ kranthi117 znalazłeś odpowiedź na to? –

+0

@SharpEdge jeszcze nie :( – kranthi117

Odpowiedz

1

Istnieje kilka powodów, dla których może się tak dziać. Po pierwsze, czy Twoja praca powraca false w onStopJob()? W przypadku konieczności ponownej próby wykonania zadania zostanie wykonane ponowne zwolnienie. Połącz to z faktem, że chcesz, aby był uruchamiany ponownie co 10-20 sekund, aby uzyskać wyniki, których doświadczasz.

Nie ustawiono żadnych ograniczeń dla zadania, które również wpłyną na jego uruchomienie. na przykład

.setConstraints( // only run on an unmetered network Constraint.ON_UNMETERED_NETWORK, // only run when the device is charging Constraint.DEVICE_CHARGING )

Ponadto chciałbym nie użyć zaplanowanego zadania za to, co robisz. Spójrz na klienta Google API, który oferuje okresowe aktualizacje z fused location provider.

można wdrożyć zwrotnego od usługi lub działalność jak tak

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); 
    } 
} 

Checkout pełnych docs tutaj, ale wierzę, trzeba będzie bardziej spójne doświadczenie z usług dedykowanych do tego, co staramy się osiągnąć.

https://developer.android.com/training/location/receive-location-updates.html

+0

Jeśli chodzi o 'onStopJob', próbowałem zarówno z' true', jak i 'false', bez powodzenia, jeśli chodzi o topionego dostawcę lokalizacji, tak, używam go do określenia bieżącej lokalizacji – kranthi117

+0

Ale możesz również użyć wywołania zwrotne LocationChanged w celu zamiany zaplanowanego zadania –

+0

Wypróbowałem dokument, z którym się łączyłeś. Ale to wymaga aktywnej aktywności lub usługi, z trybem Doze i AppStandby, to zbyt dużo bólu głowy – kranthi117

1

ExecutionWindow określa przybliżoną godzinę. Nie ma gwarancji, że zadanie zostanie uruchomione w danym oknie. W razie pomyłki w oknie zadanie zostanie uruchomione najwcześniej w późniejszym czasie w idealnych warunkach. Dla powtarzających się zadań po zakończeniu zadania następne zadanie obliczy czas wykonania okna od ostatniego zlecenia czasowego.

LINK

ExecutionWindow reprezentuje wyzwalacz pracę, która kwalifikuje się raz aktualny czas, jaki upłynął, przekracza planowego czasu + przycisk {@code windowStart} wartość. Zaleca się, aby mechanizm zaplecza harmonogramu używał wartości windowEnd jako sygnału , aby zadanie było uruchamiane, ale nie jest to zachowanie wymuszone.

4

Również:

Trigger.executionWindow(windowStart, windowEnd) 

oczekuje windowStart i windowEnd sekund.Zgodnie z wymaganiami, chcesz, aby okno było 10 minut. Więc powinieneś użyć czegoś takiego:

Trigger.executionWindow(10*60, 20*60)