Elapse计时器事件

时间:2012-03-27 18:22:33

标签: android mono xamarin.android

我正在制作一个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 tempo:

    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 ...

看起来每次我旋转屏幕时,活动都不会被活动破坏,还会再建一个。

任何sugestions?

韩国社交协会

1 个答案:

答案 0 :(得分:0)

  

看起来每次我旋转屏幕时,活动都不会被活动破坏,还会再建一个。

如果“事件”是指Vars.p_Temporizador.Elapsed事件,则,除非您明确这样做,否则不会自动清除事件。结果是,在每个屏幕旋转中,您将添加一个新的事件处理程序,事件处理程序的所有将触发,并且(最差)“死”活动将无法收集(因为会有一个事件处理程序使Activity保持活动状态。)

我认为最简单的解决方法是不订阅来自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++;
            }
        };
    }
}

这样,每次重新创建Activity时,您都不必担心使事件无效,您只需要更新VariaveisGlobais.activity1字段以引用当前的Activity。

您可能还想覆盖Activity.OnDestroy()以清除VariaveisGlobais.activity1字段:

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