夜间AppWidget网络超时

时间:2018-10-15 13:12:09

标签: c# android xamarin widget

我正在编写一个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分钟之后!或者我应该在调用此功能之前检查小部件是否可以访问互联网。

0 个答案:

没有答案