2017-02-07 1 views
1

У меня есть класс, который реализует Анимация. Я зарегистрирую этот класс как анимированный в моей форме. Он работает, но 1 раз из 20 (или закрывается) не зарегистрирован: animate() не называется вообще.Codename One - Form.registerAnimated() иногда не регистрирует анимацию

В приведенном ниже примере мы видим, что RollAnim2.start() называется, но RollAnim2.animate() нет.

public class RollAnimation implements Animation { 

    public void start() { 
       myForm.registerAnimated(this); 
       Log.p("RollAnim "+this.id+" : starting!\ntargets: "+ 
       + targetFrames.toString() +"\ncurrent: " + 
       + sTempFrames()); 
      } 

    public void stop() { 
      myForm.deregisterAnimated(this); 
      Log.p("RollAnim "+this.id+" : stopped!\ntargets: "+ 
      +targetFrames.toString() + 
      +"\ncurrent: " + sTempFrames()); 
     } 
    @Override 
    public boolean animate() { 
      Log.p("RollAnim "+this.id+" : Animate()"); 
      //Some mechanics here 
      if (blablabla) { 
       this.stop(); 
       return false; 
      } else 
       return true; 
} 

Срубы:

[Timer-20] 0:1:14,119 - RollAnim 2 : starting! 
targets: [30, 60, 90, 50, 30, 40] 
current: [90, 80, 70, 30, 80, 20] 
[Timer-16] 0:1:14,119 - RollAnim 0 : starting! 
targets: [0, 60, 70, 30, 50, 40] 
current: [60, 0, 60, 80, 20, 80] 
[Timer-19] 0:1:14,119 - RollAnim 4 : starting! 
targets: [60, 60, 30, 50, 50, 0] 
current: [80, 30, 0, 10, 20, 50] 
[Timer-18] 0:1:14,119 - RollAnim 3 : starting! 
targets: [70, 50, 70, 0, 70, 40] 
current: [80, 20, 80, 10, 40, 0] 
[Timer-17] 0:1:14,120 - RollAnim 1 : starting! 
targets: [10, 20, 30, 10, 60, 10] 
current: [50, 10, 40, 70, 90, 60] 
[EDT] 0:1:14,120 - RollAnim 0 : Animate() 
[EDT] 0:1:14,121 - RollAnim 4 : Animate() 
[EDT] 0:1:14,121 - RollAnim 3 : Animate() 
[EDT] 0:1:14,121 - RollAnim 1 : Animate() 
[EDT] 0:1:14,139 - RollAnim 0 : Animate() 
[EDT] 0:1:14,139 - RollAnim 4 : Animate() 
[EDT] 0:1:14,139 - RollAnim 3 : Animate() 
[EDT] 0:1:14,139 - RollAnim 1 : Animate() 
[EDT] 0:1:14,154 - RollAnim 0 : Animate() 
[EDT] 0:1:14,154 - RollAnim 4 : Animate() 
*** 
[EDT] 0:1:14,725 - RollAnim 3 : stopped! 
targets: [70, 50, 70, 0, 70, 40] 
current: [70, 50, 70, 0, 70, 40] 
[EDT] 0:1:14,878 - RollAnim 4 : stopped! 
targets: [60, 60, 30, 50, 50, 0] 
current: [60, 60, 30, 50, 50, 0] 
[EDT] 0:1:15,28 - RollAnim 0 : stopped! 
targets: [0, 60, 70, 30, 50, 40] 
current: [0, 60, 70, 30, 50, 40] 
[EDT] 0:1:15,58 - RollAnim 1 : stopped! 
targets: [10, 20, 30, 10, 60, 10] 
current: [10, 20, 30, 10, 60, 10] 

Что я должен сделать, чтобы решить эту проблему?

Update

Это не Таймер & EDT проблема взаимодействия. Этот объект занят в качестве медиатора:

public class AnimationCrutch implements Animation { 

    protected ArrayList<Animation> toRegister = new ArrayList<Animation>(); 
    protected Form master; 
    public void registerAnimated (Animation animation) { 
     toRegister.add(animation); 
    } 
    public AnimationCrutch (Form master) { 
     this.master = master; 
     this.master.registerAnimated(this); 
    } 
    @Override 
    public boolean animate() { 
     if (toRegister.size() == 0) return false; 
     for (Animation anim : toRegister) { 
      this.master.registerAnimated(anim); 
     } 
     toRegister.clear(); 
     return false; 
    } 

    @Override 
    public void paint(Graphics g) { 
     // TODO Auto-generated method stub 
    } 

} 
+0

Похоже, что проблема вызвана взаимодействием Timer -> EDT. –

ответ

1

Мне пришлось отказаться от регистрации на регистрацию, чтобы приложение работало по назначению. Надеюсь, это не очень дорого держать animate(), возвращая false, когда не нужно ничего оживлять.

0

Получение регистрации/отмены регистрации симбиотических отношений может быть сложным.

Похоже, что start() был вызван до того, как был вызван stop(). Я бы предложил проверить этот специальный случай.