2016-04-03 7 views
1

Mein Timer hört nicht auf zu laufen, wenn ich es annulliere! Der Timer stoppt nur, wenn ich die ganze App herunterfahre!Timer wird nicht von timer.cancel() abgebrochen

Ich weiß nicht, warum der Timer nicht abgebrochen wird. Wenn ich jeden Versuch auschecke, den Timer zu löschen, bekomme ich Hunderte Zeilen, aber der Timer hört nicht auf!

Meine Klasse:

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 
} 

Ich hoffe, dass Sie mir helfen können! Danke!

Antwort

0

Ich würde vorschlagen, einen Thread anstelle eines Timers zu verwenden. Ihr Start_Timer() Code würde in etwa wie folgt ändern:

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

Themen sind effizienter und leicht und perfekt für Ihre Bedürfnisse. Wenn Sie den Thread auf eine globale Variable setzen, können Sie außerdem sicherstellen, dass Sie während Android-Lebenszyklusereignissen mTimerThread.interrupt(); aufrufen, beispielsweise onPause().

Ich hoffe, das behebt Ihr Problem. Denken Sie daran, das Java Thread ist Ihr Freund!

+0

ok danke, aber warum funktioniert es nicht mit dem Timer? und weiß, ich weiß, warum ich Threads verwenden sollte :) –

+0

Es war, wie die andere Antwort sagte - Sie erstellt einen neuen Timer jedes Mal, wenn Sie den Fortschrittsbalken aktualisiert, der Ihre Probleme verursacht hat. Froh, dass es behoben ist :) – privatestaticint

+0

okey ja, das ist toll :) –

0

Sie erstellen und starten einen neuen Timer, der Benutzer bewegt die Suchleiste (in onProgressChanged()). Das bedeutet auch, dass Sie den Bezug auf das alte verlieren. Wenn isPlaying false wird, versuchen alle Timer timer zu löschen - das bezieht sich nur auf den neuesten.

Verwandte Themen