我正在编写一个Android小部件,一旦检测到新的一天,它应该会更新一些信息。 提供程序很简单并且可以正常工作:
<?xml version="1.0" encoding="UTF-8" ?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="80dip"
android:minHeight="72dp"
android:resizeMode="horizontal"
android:minResizeWidth="72dp"
android:updatePeriodMillis="14400000"
android:initialLayout="@layout/Widget3"
android:previewImage="@drawable/previewImage"
android:configure="com...MYAPP...AppConfigure"
/>
它每4小时更新一次小部件。 如果检测到新的一天,我想下载新的数据。这在夜间失败(Oreo,API27):
private async Task<bool> DownloadNewShifts(Context context) {
var request = WebRequest.Create(@"https://www.MYWEBPAGE.com/v3/api/1.0/");
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.Headers.Add("Com-MYAPP-Request", "Viewer");
request.Timeout = 1000 * 10;
var postData = "id=" + lines[0] + "&code=" + lines[1] + "&month=105";
var data = Encoding.UTF8.GetBytes(postData);
request.ContentLength = data.Length;
try {
using (var stream = await request.GetRequestStreamAsync()) {
stream.Write(data, 0, data.Length);
}
}
catch(Exception ex) {
return false;
}
….
return true;
}
它有效,我每4个小时就会收到一次新数据。但是在晚上,我总是收到“超时异常”。奇怪的是,在调用该方法后9-10分钟就会发生超时。因此,即使将超时设置为10秒也无济于事。
“请勿打扰”是否有可能阻止我的网络通话?从8:00开始生效,我得到了新数据。
我不知道Android如何处理widget_update方法以及为什么几秒钟后它不会被杀死(如果我在事件日志中记录并写入每个动作,我会在10分钟内看到它们的写法)。
好,用于Internet连接。它似乎是buggandroid之一。自从Android 7出现以来,它与电池优化有关:
https://forums.androidcentral.com/showthread.php?t=811927&p=5991696&viewfull=1#post5991696
一旦我为我的应用禁用了该请求,该请求将不再超时。以下是有关如何在Android上为单个应用禁用电池优化的说明:
https://www.makeuseof.com/tag/androids-battery-optimization-harm-good/
但这并不是真正的解决方案。我认为我必须忍受这个错误并在与服务器建立连接后更新小部件。
仍然不知道为什么超时时间长达30分钟(今天晚上)! 我投放了Webrequest,因此我还可以设置读写超时:
var request = (HttpWebRequest)WebRequest.Create(@"https://www.MYWEBPAGE.com/v3/api/1.0/");
request.Timeout = 1000 * 10;
request.ReadWriteTimeout = 1000 * 10;
它无效。似乎更多是Xamarin错误。我可能会使用WebClient:我没有很多选项和功能,但是超时发生在15秒之后而不是20-30分钟之后!或者我应该在调用此功能之前检查小部件是否可以访问互联网。