2016-04-09 21 views
0

Kodumda her X saniyede çalışan bir işleyici var. Her çalıştığında, bir görevi yürütür. Görev, kullanıcı etkileşimi olmaksızın 4 kez yürütüldüğünde, ana etkinliğime geri dönmeye ayarlıyorum.Android: işleyici doğru şekilde iptal edilmiyor

final Handler h1 = new Handler(); 
    final int delay1 = 400; 

    h1.postDelayed(new Runnable(){ 
     public void run(){ 
      enableRandomButton(); 
      buttonsInPlay = sumVector(greenButtons); 

      if (buttonsInPlay >= 4){ 

       if (currentScore > highScore){ 
        highScore = currentScore; 
       } 

       // GO TO SCORE SCREEN 
       h1.removeCallbacks(this); 
       Intent intent = new Intent(Game.this, Main.class); 
       Game.this.startActivity(intent); 
       Game.this.finish(); 
      } 

      h1.postDelayed(this, delay1); 
     } 
    }, delay1); 

onu geri ana ekrana gider noktaya, öyle: İşte işleyicisi kodudur. Ancak, ana ekrana geri döndüğünde, KEEPS süresiz olarak yeni ana faaliyetler başlatıyor. Bu işleyicinin bir nedenle doğru şekilde iptal edilmediğinden şüpheleniyorum. Yukarıdaki kodumda bir sorun yoksa, kodumun geri kalanını paylaşmaktan memnuniyet duyacağım (çoğunlukla Android yaşam döngüsü yöntemlerim vb.). Teşekkürler!

+0

"Ana etkinliğime geri dönmek için ayarladım." - Gerçekten geri dönmeyeceksin; Faaliyetin yeni bir örneğini başlatıyorsunuz. Geri dönmek isterseniz, sadece '' '(' '' '' '' '' aktivitesini bitir. Ayrıca, açıklanan davranışa neden olan yeni bir durum başlattığınız gerçeğinden de şüphe duyarım, ancak bunu belirleyebilmek için daha fazla kod göndermeniz gerekir. –

+0

Kodumda açıkça Game.this.finish(); gerçi. Amaca başlamadan önce bitirmek zorunda mıyım? –

+1

Üzgünüz, yorumumu düzenliyordum. _just_ 'finish()' yapmalısınız. Ana 'Etkinliğiniz' hala arka yığındaysa, önceki örneğe döner. Yeni bir tane başlatmaya gerek yok. –

cevap

0

Bunun yerine bunu deneyin. Sadece sonlandırma koşulu yerine getirildiğinde Runnable'ı tekrar göndermeyin. Ayrıca, son() öğesinin hemen geçerli olmadığını ve şu anki iş biriminin yürütülmesini engellemediğini unutmayın:

 if (buttonsInPlay >= 4){ 
      if (currentScore > highScore){ 
       highScore = currentScore; 
      } 

      // GO TO SCORE SCREEN 
      // h1.removeCallbacks(this); // not helpful, nothing is scheduled at this moment 
      Intent intent = new Intent(Game.this, Main.class); 
      Game.this.startActivity(intent); 
      Game.this.finish(); 
     } 
     else { 
      // Only reschedule if we have to continue 
      h1.postDelayed(this, delay1); 
     }