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