2016-04-03 18 views
1

Eğer iptal edersem Timer'ım çalışmıyor! Zamanlayıcı sadece tüm uygulamayı kapatırsam durur!Zamanlayıcı, timer.cancel() tarafından iptal edilmedi()

Zamanlayıcının neden iptal edilmediğini bilmiyorum. Zamanlayıcıyı iptal etmek için her denemeyi yazdırırsam, satırların hilelerini alıyorum ama Zamanlayıcı durmuyor!

My Sınıf:

public class PlayActivity extends AppCompatActivity 
     implements View.OnClickListener, SeekBar.OnSeekBarChangeListener, MediaplayerEvent { 

    //region Activity 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     Initialize_Layout(); 
     Initialize_Objects(); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 

     MusicService.setMediaPlayerEvent(this); 

     txvSongtitle.setText(serviceInterface.MP_getActualSong().getTitle()); 

     Start_Timer(); 
    } 

    @Override 
    protected void onPause() { 
     timer.cancel(); 

     MusicService.clearMediaPlayerEvent(); 

     super.onPause(); 
    } 

    @Override 
    public boolean onSupportNavigateUp() { 
     finish(); 

     return super.onSupportNavigateUp(); 
    } 

    //endregion 

    //region Methods 

    private void Start_Timer() { 
     timer = new Timer(); 

     timer.scheduleAtFixedRate(new TimerTask() { 
      @Override 
      public void run() { 
       if (serviceInterface.MP_isPlaying()) { 
        runOnUiThread(new Runnable() { 
         @Override 
         public void run() { 
          seekBar.setMax(serviceInterface.MP_getDuration()); 
          seekBar.setProgress(serviceInterface.MP_getCurrentPosition()); 
         } 
        }); 
       } 
       else { 
        runOnUiThread(new Runnable() { 
         @Override 
         public void run() { 
          timer.cancel(); 
         } 
        }); 
       } 
      } 
     }, 0, 200); 
    } 

    @Override 
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
     if (fromUser) { 
      serviceInterface.MP_seekTo(progress); 

      Start_Timer(); 
     } 
    } 

    //endregion 
} 

Bana yardım eder! Teşekkürler!

cevap

0

Zamanlayıcı yerine Thread kullanılmasını öneririm. Sizin Start_Timer() kodu aşağıdaki gibi bir şey değiştirecek:

private Thread mTimerThread; 

... 

private void Start_Timer() { 
    mTimerThread = new Thread() { 
     @Override 
     public void run() { 
      try { 
       while (!isInterrupted()) { 
        if (serviceInterface.MP_isPlaying()) { 
         runOnUiThread(new Runnable() { 
          @Override 
          public void run() { 
           seekBar.setMax(serviceInterface.MP_getDuration());      
           seekBar.setProgress(serviceInterface.MP_getCurrentPosition()); 
          } 
         }); 
        } else { 
         interrupt(); 
        } 
        Thread.sleep(200); 
       } 
      } catch (InterruptedException e) { 
      } 
     } 
    } 
    mTimerThread.start(); 
} 

konu ihtiyaçlarınız için daha verimli ve hafif ve mükemmeldir. Ayrıca, Thread'i genel bir değişkene ayarlayarak, gibi Android yaşam döngüsü etkinliklerinde mTimerThread.interrupt();'u aradığınızdan emin olabilirsiniz.

Umarım bu sorununuzu giderir. Unutmayın, Java Thread arkadaşınız!

+0

ok teşekkürler ama neden zamanlayıcı ile çalışmıyor? ve biliyorum neden kullanmalıyım Threads :) –

+0

Diğer cevaplar arasındaydı - sorunlara neden olan ilerleme çubuğunu her güncellediğinizde yeni bir zamanlayıcı oluşturuyordunuz. Sevindim sevindim :) – privatestaticint

+0

okey evet, thats harika :) –

0

Yeni bir zamanlayıcı oluşturuyor ve başlatıyorsunuz, kullanıcı arama çubuğunu taşıyor (onProgressChanged()). Bu aynı zamanda eskisine referansı kaybettiğiniz anlamına gelir. IsPlaying öğesi false olduğunda, tüm zamanlayıcılar timer'u iptal etmeye çalışacaktır - bu yalnızca en yeni olanı referans alır.

İlgili konular