2016-04-03 4 views
1

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

Тем более эффективны и легкий и идеально подходит для ваших нужд. Кроме того, установив поток в глобальную переменную, вы можете позвонить mTimerThread.interrupt(); во время событий жизненного цикла Android, например onPause().

Я надеюсь, что это исправляет вашу проблему. Помните, что Java Thread - ваш друг!

+0

ОК спасибо, но почему это не работает с таймером? и знаю, что знаю, почему я должен использовать Threads :) –

+0

Как и в другом ответе, вы создавали новый таймер каждый раз, когда вы обновляли индикатор выполнения, что вызывало проблемы. Рад, что он исправлен :) – privatestaticint

+0

okey yeah, thats great :) –

0

Вы создаете и запускаете новый таймер, пользователь перемещает стрелку (в onProgressChanged()). Это также означает, что вы теряете ссылку на старый. Когда isPlaying становится ложным, все таймеры будут пытаться отменить timer, который ссылается только на самую последнюю.

Смежные вопросы