Elapse Timer Event - PullRequest
       5

Elapse Timer Event

0 голосов
/ 27 марта 2012

Я делаю System.Timer, используя событие elapse для обновления int объекта, например:

public class VariaveisGlobais : Java.Lang.Object
    {            
        SqlConnection BDLinha1 = new SqlConnection();
        public SqlConnection p_BDLinha1
        {
            get { return BDLinha1; }
            set { BDLinha1 = value; }
        }

        System.Timers.Timer Temporizador = new System.Timers.Timer(1000);
        public System.Timers.Timer p_Temporizador
        {
            get { return Temporizador; }
            set { Temporizador = value; }
        }

        int Tempo = 0;            
        public int p_Tempo
        {
            get { return Tempo; }
            set { Tempo = value; }
        }
    }

Затем я использую делегата для обновления темпа var:

    Vars.p_Temporizador.Elapsed += delegate
    {
        RunOnUiThread(() => AutoCompleta4.Text = Vars.p_Tempo.ToString());
        Vars.p_Tempo++;
    };

И для управления поворотом экрана я использую:

public override Java.Lang.Object OnRetainNonConfigurationInstance()
{
    return Vars;         
}

И используйте LastNonConfigurationInstance для восстановления переменных моего приложения.

Но каждый раз, когда я поворачиваю экран, таймер добавляет еще одно число к событию. Пример: 1 оборот = 1 - 3 - 5 - 7 ..., 2 вращения = 1 - 4 - 7 ..., 3 вращения = 1 - 5 - 9 - 13 ...

Похоже, что каждый раз, когда я поворачиваю экран, событие не уничтожается действием, и еще один - сборка.

Любые предложения?

Tks.

1 Ответ

0 голосов
/ 28 марта 2012

Похоже, что каждый раз, когда я поворачиваю экран, событие не уничтожается действием, и еще один - сборка.

Если под «событием» подразумевается событие Vars.p_Temporizador.Elapsed, то нет , события не очищаются автоматически, если вы явно не сделаете это. В результате получается, что при каждом повороте экрана вы будете добавлять новый обработчик событий, все обработчиков событий будут срабатывать, и (что хуже всего) «мертвые» действия не будут собираться ( потому что будет обработчик событий, поддерживающий активность).

Я думаю, что самым простым решением было бы не подписаться на событие с OnCreate() (где я предполагаю, что вы подписываетесь на событие), а вместо этого использовать поле:

// For the sake of argument, your main activity is Activity1...
partial class Activity1 {
    internal EditText AutoComplete4;

    protected override void OnCreate (Android.OS.Bundle bundle)
    {
        // ...
        Vars.activity1 = this;
    }
}

partial class VariaveisGlobais {

    public Activity1 activity;

    public VariaveisGlobais ()
    {
        p_Temporizador.Elapsed += delegate {
            if (activity1 != null) {
                activity1.RunOnUiThread(() => activity1.AutoComplete4 = p_Tempo.ToString());
                p_Tempo++;
            }
        };
    }
}

Таким образом, каждый раз при повторном создании действия вам не нужно беспокоиться о признании события недействительным, вам просто нужно обновить поле VariaveisGlobais.activity1, чтобы оно ссылалось на текущее действие.

Вы также можете переопределить Activity.OnDestroy () , чтобы очистить поле VariaveisGlobais.activity1:

partial class Activity1 {
    protected override OnDestroy ()
    {
        Vars.activity1 = null;
    }
}
...