Тайм-аут сети AppWidget ночью - PullRequest
       5

Тайм-аут сети AppWidget ночью

0 голосов
/ 15 октября 2018

Я пишу виджет 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 минут).

Редактировать - проблема с сетью

ОК, для подключения к интернету.Кажется, это один из баггандроидов.Это связано с оптимизацией батареи, присутствующей с 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 минут (этой ночью)!Я разыграл веб-запрос, чтобы установить тайм-аут чтения-записи:

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 минут!Или я должен проверить, имеет ли виджет доступ к Интернету, прежде чем вызывать эту функцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...