Как остановить таймер / изменить системный интерфейс OnSleep Xamarin Android - PullRequest
0 голосов
/ 13 декабря 2018

Итак, у меня есть приложение, которое при нажатии кнопки: запускает таймер, циклически перебирает один (++) фрагмент данных, скрывает кнопку запуска и вместо этого показывает кнопку «Стоп» и «Далее».Я заглянул в центр обмена сообщениями и подумал, что это исправляет проблему (вот ссылка Xamarin. Формы, как мне получить доступ к публичной функции из другого файла CS? ), но это не решило проблему полностью.

Если в приложении работает таймер (иначе вы нажали кнопку «Пуск»), а затем прервали процесс, нажав кнопку «Домой» на вашем телефоне, приложение работает нормально, и приложение скрывает кнопки «Стоп / следующий» и показываеткнопка запуска и остановки таймера.Если вы вообще не запустили процесс (иначе вы не нажали кнопку «Пуск») и нажали кнопку «Домой» на своем телефоне, приложение выдает ошибку исключения, потому что то, что я изменяю с помощью центра сообщений «не нужно»меняется, потому что никогда не менялся ".Есть ли лучший способ справиться с этой ситуацией?

Можно ли использовать операторы if / else в состоянии приложения с Messagingcenter ??Я застрял.

App.xaml.cs

protected override void OnSleep()
    {
        // Handle when your app sleeps
        Debug.WriteLine("~~~~~~~~~~~~~~OnSleep~~~~~~~~~~~~~");
        MessagingCenter.Send<App>(this, "OnSleep");
    }

MainPage.xaml.cs

MessagingCenter.Subscribe<App>(this, "OnSleep", (sender) => {
            //shows start button instead of stop button
            StartGrid.IsVisible = true;
            //hides stop button
            StopNextGrid.IsVisible = false;

            //stops timer
            timer.Stop();
            timer = null;
            //stops sound
            startSound.Stop();
            stopSound.Play();
        });

1 Ответ

0 голосов
/ 14 декабря 2018

Просто видите частичный код, вы должны проверить, инициализирован ли ваш таймер, прежде чем выполнять метод .

Когда вы не нажимаете кнопку пуска, вам нужно проверить,timer инициализируется для выполнения следующей операции таймера.

Если нет необходимости знать, инициализирован ли таймер.Вы можете попробовать это:

Изменить метод обработки уведомлений. Если состояние вашего таймера и кнопки не изменилось, вам ничего не нужно делать в уведомлении. Здесь я использую timer как приговор.

MessagingCenter.Subscribe<App>(this, "OnSleep", (sender) => {
//shows start button instead of stop button
if (null != timer)
{
    StartGrid.IsVisible = true;
    //hides stop button
    StopNextGrid.IsVisible = false;
    //stops timer
    timer.Stop();
    timer = null;
    //stops sound
    startSound.Stop();
    stopSound.Play();
}
});
...