удаление фонового таймера c # Xamarin Android

#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. Проблема в том, что когда пользователь возобновляет приложение, таймер продолжает отсчет, и приложение просто останавливается и в конечном итоге выходит из строя. Функции «при возобновлении», «при запуске», перезапуск, функция не вызываются, а функции вне этих событий не могут видеть действия пользователя. Я решил эту проблему, создав сервис, я опубликую свой ответ, как только увижу, что он полностью работает. Спасибо за помощь.