#c# #android #xamarin #timer #background
#c# #Android #xamarin #таймер #фон
Вопрос:
Когда мое приложение переходит в фоновый режим, запускается таймер (в OnStop()
переопределении)
На этот раз просто выполняйте запрос каждые 10 секунд.
Если результат «x», Тани создает уведомление и удаляет таймер. Теперь я могу либо щелкнуть уведомление, либо возобновить работу приложения.
Но если я хочу использовать приложение, возобновляющее его, оно застревает в «остановленном» макете, и я вижу, что таймер не умирает (с консоли).
Я пытался остановить это в OnResume()
, OnStart()
, OnRestart()
но ни один из них не вызывается, таймер все равно срабатывает, и приложение вылетает.
Я почти уверен, что мой способ проверки обновления базы данных в фоновом режиме очень плох, но я хотел бы использовать этот способ.
Время выполняется следующим образом:
public class TimerExampleState
{
public int counter = 0;
public Timer tmr;
}
protected override void OnStop()
{
base.OnStop();
GlobalVar.KillTimer = 0;
StuffInStop();
}
public void StuffInStop()
{
TimerExampleState s = new TimerExampleState();
TimerCallback timerDelegate = new TimerCallback(CheckStatus);
Timer timer = new Timer(timerDelegate, s, 1000, 10000);
s.tmr = timer;
while (s.tmr != null)
Thread.Sleep(0);
}
public async void CheckStatus(Object state)
{
TimerExampleState s = (TimerExampleState)state;
s.counter ;
if (s.counter == 2)
{
int x = await AsyncIntCheck();
if (GlobalVar.KillTimer == 1)
{
Console.WriteLine("disposing of timer...");
s.tmr.Dispose();
s.tmr = null;
}
s.counter = 1;
}
}
это AsyncIntCheck
функция проверки обновлений (это функция int, потому что позже она вернет количество обновленных частей).
Как вы можете себе представить, у меня есть глобальный int, когда я создаю уведомление, я устанавливаю GlobalVar.KillTimer
значение 1, и таймер отключается.
Надеюсь, я написал все необходимое, просто для избыточности, я хочу отключить таймер, когда пользователь возобновит работу приложения.
Спасибо.
Комментарии:
1. Этот код не будет выполняться. Вы не можете запускать таймер в фоновом режиме, особенно в iOS. Вам необходимо выполнить действия, зависящие от платформы (что может быть даже невозможно на некоторых платформах).
2. Этот код действительно работает, я использую его и работает на моем смартфоне. Это даже пошаговое руководство по xamarin (меня интересует только Android). Единственное, чего я не могу достичь, это отключить таймер, когда пользователь возобновит активность.
3. вы сказали, что установка глобальной переменной убивает таймер, так в чем же проблема?
4. Проверьте, в каком потоке вы создаете таймер и какой поток пытается его уничтожить. Если потоки разные, таймер не будет уничтожен.
5. Проблема в том, что когда пользователь возобновляет приложение, таймер продолжает отсчет, и приложение просто останавливается и в конечном итоге выходит из строя. Функции «при возобновлении», «при запуске», перезапуск, функция не вызываются, а функции вне этих событий не могут видеть действия пользователя. Я решил эту проблему, создав сервис, я опубликую свой ответ, как только увижу, что он полностью работает. Спасибо за помощь.