Mam aplikację, która używa AlarmManager
do planowania powtarzającego się alarmu co X ilość czasu. Kiedy mój odbiornik otrzymuje Intent
, musi wykonać żądanie http.Wywołanie połączenia sieciowego z przekroczeniem czasu alarmu
Sam alarm działa dobrze i uruchamia się, gdy powinien. Jednak połączenie sieciowe rozpoczyna limit czasu, gdy telefon nie jest używany. Aby być bardziej szczegółowym:
Kiedy planuję strzelać co minutę (zła praktyka, wiem, ale tylko dla zilustrowania), pierwsze 5-8 minut żądanie się powiedzie. Potem otrzymuję numer java.net.SocketTimeoutException: connect timed out
. Czasami to się udaje, ale w większości tak się dzieje.
Próbowałem ustawić limit czasu połączenia/odczytu/zapisu na minutę, ale otrzymałem ten wyjątek zamiast powyższego: java.net.ConnectException: Failed to connect to myapp.example.com/123.45.67.89:80
.
Mój kod:
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// Consider mApi and myBody to be initialised and valid
mApi.myPostRequest(myBody).enqueue(new Callback<Void> {
@Override
public void onResponse(Call<Void> call, Response<Void> response) {
//Does not get here
}
@Override
public void onFailure(Call<Void> call, Throwable t) {
t.printStackTrace();
}
}
}
}
Rzeczy próbowałem:
- jak wspomniano wcześniej, zwiększając limity czasu
- nabycia
WakeLock
wonReceive
i zwalniając go, gdy połączenie jest wykonywane (dodano uprawnienie )
Pozostałe informacje:
- Alarm jest ustawiony za pomocą
alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), interval, pendingIntent);
z mojegoActivity
. - Używam Retrofit (2.1.0) dla komunikacji sieciowej, ale prawdopodobnie można by było się domyślić, że z mojego kodu;)
pomysłów, w jaki sposób uzyskać połączenie sieciowe działa, gdy telefon jest spanie?
Brzmi [ingerencja tryb Doze] (https: //developer.android.com/training/monitoring-device-state/doze-standby.html). W przypadku urządzeń z Androidem 5.0 lub nowszym rozważ przejście na "JobScheduler" i skonfiguruj zadania, aby uzyskać kontrolę tylko wtedy, gdy istnieje połączenie z Internetem. – CommonsWare