我正在制作一个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?
韩国社交协会
答案 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;
}
}