2016-04-03 50 views
1

如果我取消它,My Timer不會停止運行! 只有關閉了整個應用程序,計時器纔會停止!定時器不會被timer.cancel取消()

我不知道爲什麼定時器沒有被取消。如果我打印出每一次取消定時器的嘗試,我都會得到很多線條,但定時器不會停止!

我的班級:

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 
} 

我希望你能幫幫我! 謝謝!

回答

0

我建議使用Thread而不是定時器。你Start_Timer()代碼將變爲像下面這樣:

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

線程是更有效和更輕便,非常適合您的需求。此外,通過將線程設置爲全局變量,您可以確保在Android生命週期事件期間致電mTimerThread.interrupt();,例如onPause()

我希望這可以解決您的問題。請記住,Java Thread是你的朋友!

+0

好的謝謝,但爲什麼它不適用於計時器? 並知道爲什麼我應該使用線程:) –

+0

正如另一個答案所說 - 你每次更新進度條時都會創建一個新的計時器,這是造成你的問題的原因。很高興它的固定:) – privatestaticint

+0

奧基耶,多數民衆贊成在:) –

0

您正在創建並啓動用戶移動搜索欄的新計時器(位於onProgressChanged())。這也意味着你失去了對舊的引用。當isPlaying變爲false時,所有定時器將嘗試取消timer - 僅引用最近的一個。