【发布时间】:2017-11-22 05:00:22
【问题描述】:
我有一个应用程序,它使用AlarmManager 来安排每隔 X 时间重复警报。当我的接收者收到Intent时,它必须发出一个http请求。
警报本身可以正常工作并在应该触发时触发。但是,当电话不使用时,网络呼叫开始超时。具体来说:
当我安排它每分钟触发一次时(我知道这是不好的做法,但只是为了说明),前 5-8 分钟请求成功。之后,我收到了java.net.SocketTimeoutException: connect timed out。有时它确实会成功,但大多数情况下都会发生这种情况。
我尝试将连接/读/写超时设置为一分钟,但后来我得到了这个异常而不是上面的那个:java.net.ConnectException: Failed to connect to myapp.example.com/123.45.67.89:80。
我的代码:
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();
}
}
}
}
我尝试过的事情:
- 如前所述,增加超时时间
- 获取
WakeLockinonReceive并在通话完成时释放它(添加 许可)
其他信息:
- 警报设置使用
alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), interval, pendingIntent);来自我的Activity。 - 我正在使用 Retrofit (2.1.0) 进行网络通信,但您可能已经从我的代码中猜到了 ;)
关于如何在手机休眠时让网络通话正常工作有什么想法吗?
【问题讨论】:
-
听起来像Doze mode interference。对于您的 Android 5.0+ 设备,请考虑切换到
JobScheduler并将作业配置为仅在有 Internet 连接时才能获得控制权。 -
@jelsief 你找到解决方案了吗?
-
@dor506 我没有继续这个项目..
标签: android networking retrofit alarmmanager