2012-03-27 1 views
0

Делаю System.Timer, используя событие истечь обновить Int объекта, например:Elapse Таймер событий

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

Тогда я использовать делегат обновить УАК темп:

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.

ответ

0

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

Если на «событие» вы имеете в виду 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; 
    } 
} 
+0

После небольшой корректировки, она работала. Благодаря ! – Juliano

 Смежные вопросы

  • Нет связанных вопросов^_^