2016-04-03 13 views
1

キャンセルするとタイマーは停止しません! アプリ全体をシャットダウンするとタイマーが停止するだけです!timer.cancel()によってタイマーがキャンセルされない

なぜタイマーがキャンセルされたのかわかりません。私がタイマーをキャンセルしようとするたびに印刷してみると、私はhundretsのラインを得るが、タイマーは止まらない!

私のクラス:

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

スレッドは、あなたのニーズに合わせて、より効率的かつ軽量で、完璧です。さらに、スレッドをグローバル変数に設定することで、onPause()など、Androidライフサイクルイベント中にmTimerThread.interrupt();に確実に電話することができます。

この問題が解決したらうれしいです。覚えておいてください、Java Threadはあなたの友人です!

+0

okありがとうございますが、なぜタイマーでは機能しませんか? スレッドを使用すべき理由を知っています: –

+0

これは、他の答えが言ったように - 問題を引き起こしていたプログレスバーを更新するたびに新しいタイマーを作成していました。喜んでそれが固定されています:) – privatestaticint

+0

ああええ、thats素晴らしい:) –

0

新しいタイマーを作成して開始すると、ユーザーはシークバーを移動します(onProgressChanged())。それはまた、あなたが古いものへの参照を失うことを意味します。 isPlayingがfalseになると、すべてのタイマーがキャンセルしようとしますtimer - 最新のものだけを参照します。

関連する問題