2012-03-27 3 views
0

Ich mache eine System.Timer, mit dem Verstreichen Ereignis ein int eines Objekts zu aktualisieren, wie folgt aus:Elapse Timer Event

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; } 
     } 
    } 

Dann benutze ich einen Delegaten das var Tempo zu aktualisieren:

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

Und verwenden LastNonConfigurationInstance die Variablen meiner App wiederherzustellen:

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

Und die Bildschirm-Rotation i verwenden, um handhaben Lizenzierung.

Aber jedes Mal, wenn ich den Bildschirm rotiere, fügt der Timer eine weitere Zahl zum Ereignis hinzu. Beispiel: 1 Drehung = 1 - 3 - 5 - 7 ..., 2 Umdrehungen = 1 - 4 - 7 ..., 3 Umdrehungen = 1 - 5 - 9 - 13 ...

Sieht jedes Mal so aus Ich drehe den Bildschirm, das Ereignis wird nicht mit der Aktivität zerstört, und ein weiterer wird erstellt.

Irgendwelche Vorschläge?

Tks.

Antwort

0

Sieht aus wie jedes Mal, wenn ich den Bildschirm rotiere, wird das Ereignis mit der Aktivität nicht zerstört, und ein weiterer wird gebaut.

Wenn von „Ereignis“ Sie Vars.p_Temporizador.Elapsed Ereignis bedeuten, dann keine, Ereignisse werden nicht automatisch gelöscht, wenn Sie nicht ausdrücklich so tun. Das Ergebnis ist also, dass Sie auf jeder Bildschirmdrehung einen neuen Event-Handler hinzufügen, alle der Event-Handler werden feuern, und (schlimmstenfalls) die "toten" Aktivitäten werden nicht sammelbar sein (weil es ein Event-Handler sein, der die Aktivität am Leben erhält).

Ich denke, die einfachste Lösung wäre nicht von OnCreate() auf das Ereignis abonnieren (das ist, wo ich nehme an, Sie zu der Veranstaltung abonnieren) und ein Feld statt:

// 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++; 
      } 
     }; 
    } 
} 

Auf diese Weise, Jedes Mal, wenn die Aktivität neu erstellt wird, müssen Sie sich keine Sorgen darüber machen, dass das Ereignis ungültig wird. Sie müssen lediglich das Feld VariaveisGlobais.activity1 aktualisieren, um auf die aktuelle Aktivität zu verweisen.

Sie können auch Activity.OnDestroy() zu räumen die VariaveisGlobais.activity1 Feld außer Kraft setzen möchten:

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

Nach einer kleinen Anpassungen, es funktionierte. Vielen Dank ! – Juliano