2016-04-03 87 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 - 仅引用最近的一个。