Tôi có một ứng dụng sử dụng AlarmManager
để lên lịch báo thức lặp lại sau mỗi khoảng thời gian X. Khi người nhận của tôi nhận được Intent
, nó phải thực hiện một yêu cầu http.Cuộc gọi mạng vào thời gian báo thức ra
Báo thức hoạt động tốt và kích hoạt khi cần. Cuộc gọi mạng, tuy nhiên, bắt đầu định thời gian khi điện thoại không được sử dụng. Để cụ thể hơn:
Khi tôi lên lịch để kích hoạt từng phút (thực hành không tốt, tôi biết, nhưng chỉ để minh họa), 5-8 phút đầu tiên yêu cầu thành công. Sau đó, tôi nhận được java.net.SocketTimeoutException: connect timed out
. Đôi khi nó thành công, nhưng chủ yếu là điều này xảy ra.
Tôi đã thử đặt thời gian chờ kết nối/đọc/ghi trong một phút, nhưng sau đó tôi nhận ngoại lệ này thay vì một ngoại lệ: java.net.ConnectException: Failed to connect to myapp.example.com/123.45.67.89:80
.
Mã của tôi:
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();
}
}
}
}
Những điều tôi đã cố gắng:
- như đã nêu trước đó, timeouts tăng
- mua một
WakeLock
trongonReceive
và phát hành nó khi cuộc gọi được thực hiện (đã thêm sự cho phép )
thông tin khác:
- Các báo động được thiết lập sử dụng
alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), interval, pendingIntent);
từ tôiActivity
. - Tôi đang sử dụng Retrofit (2.1.0) cho mạng lưới giao thông, nhưng có thể bạn có thể đoán rằng từ mã của tôi;)
Bất kỳ ý tưởng về cách để có được những cuộc gọi mạng làm việc khi điện thoại ngủ?
Âm thanh như [Nữu Thừa chế độ can thiệp] (https: //developer.android.com/training/monitoring-device-state/doze-standby.html). Đối với thiết bị Android 5.0+ của bạn, hãy cân nhắc chuyển sang 'JobScheduler' và định cấu hình các công việc để chỉ kiểm soát khi có kết nối Internet. – CommonsWare