2011-03-24 77 views
0

我正在製作媒體播放器,我在其中有進度條。 點擊播放按鈕後,線程啓動,它將設置進度條的進度。 單擊暫停按鈕時,線程將停止。不能摧毀線程

但是當我按停止按鈕時,我希望進度條回滾,並在點擊播放時再次啓動,因此我希望線程銷燬但我無法做到。 當按下停止按鈕進行呼叫暫停()方法得到: -

03-24 13:17:27.855: ERROR/global(26971): java.lang.UnsupportedOperationException 

我知道這是一個過時的方法,但請我的GUID如何當按下停止按鈕來破壞線程。以下是我的代碼的一部分: -


public void onClick(View src) { 
     switch (src.getId()) { 
     case R.id.buttonStart: 
      if(DataManager.getInstance().getSongPause()=="y"){ 
       myService.player.start(); 
       DataManager.getInstance().setSongPause("n"); 
       buttonStart.setVisibility(View.GONE); 
       buttonPause.setVisibility(View.VISIBLE); 
      // DataManager.getInstance().setWantsToPlaySong(true); 
       //DataManager.getInstance().setOnPausedSong("n"); 
       //DataManager.getInstance().setOnPausedSong("y"); 
       if(mt.paused==true){ 
        mt.unPauseProgressBar(); 

       } 
      }else{ 
     stopService(new Intent(this, MyService.class)); 
      DataManager.getInstance().setSong_uri(uri); 
      Intent intent = new Intent(this,MyService.class); 
      Bundle b = new Bundle(); 
      b.putString("song_uri",uri); 
      intent.putExtras(b); 
      startService(intent); 
      buttonStart.setVisibility(View.GONE); 
      buttonPause.setVisibility(View.VISIBLE); 
      DataManager.getInstance().setOnPausedSong("y"); 
      DataManager.getInstance().setPausedSongName(songName); 
      //Toast.makeText(this, "My Service Started "+DataManager.getInstance().getSongDuration(), Toast.LENGTH_LONG).show(); 
      //new Thread(myThread).start(); 
      } 
      //Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show(); 
      break; 
     case R.id.buttonStop: 
      Log.d(TAG, "onClick: stopping srvice"); 
      stopService(new Intent(this, MyService.class)); 
      buttonStart.setVisibility(View.VISIBLE); 
      buttonPause.setVisibility(View.GONE); 
      /*mt=null; 
      seekbar.setProgress(0);*/ 
      mt.stopProgressBar(); 

      //mt.destroy(); 

      //mt.notify(); 


    break; 
     case R.id.buttonforward: 

      stopService(new Intent(this, MyService.class)); 
      current_song++; 
      FetchAllMusic fetchAllMusic = new FetchAllMusic(); 
      fetchAllMusic.execute(); 
      //new Thread(myThread).start(); 


       break; 
     case R.id.buttonbackward: 
       Log.d(TAG, "onClick: stopping service"); 
       stopService(new Intent(this, MyService.class)); 
       if(current_song>0){ 
       current_song--; 
       } 
       FetchAllMusic fetchAllMusic2 = new FetchAllMusic(); 
       fetchAllMusic2.execute(); 

       break; 
     case R.id.buttonPause: 
       buttonStart.setVisibility(View.VISIBLE); 
       buttonPause.setVisibility(View.GONE); 
      /* MyService myservice=new MyService(); 
      myservice.onPause();*/ 
       myService.player.pause(); 
      // myThread. 
       DataManager.getInstance().setSongPause("y"); 
       DataManager.getInstance().setWantsToPlaySong(false); 
       DataManager.getInstance().setOnPausedSong("n"); 
       DataManager.getInstance().setPausedSongName(songName); 

       mt.pauseProgressBar(); 

      /*try { 
       //Thread.sleep(10000); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      }*/ 

和下面是我的線程類: -

 
class myThread extends Thread implements Runnable{ 
      //  long duration=DataManager.getInstance().getSong_duration(); 
     //long value=duration/100; 
      private volatile boolean paused = false; 
      private volatile boolean finished = false; 

        @Override 
        public void run() 

        { 

         while(!finished){ 
        while (myProgress

停止進度條讓我上面提到的錯誤

回答

0

ü不能使用中止或破壞線程停止方法... 當按下停止按鈕時..
使用此How to stop a thread

檢查這個代碼...並且像這樣做是最安全的方式來讓一個標誌讓線程在它的主循環中檢查它。

class ScanningThread extends Thread { 
    // Must be volatile: 
    private volatile boolean stop = false; 

    public void run() { 
      while (!stop) { 
        System.out.println("alive"); 
      } 
      if (stop) 
        System.out.println("Detected stop"); 
    } 

    public synchronized void requestStop() { 
      stop = true; 
    } 
} 
public synchronized void startThread(){ 
    if(runner == null){ 
      android.util.Log.v("@@@@@@@@@@@@@@@@@@@@", "DoScan.startthread");   
      runner = new ScanningThread(); 
      runner.start(); 
    } 
} 
public synchronized void stopThread(){ 
    if(runner != null){ 
      android.util.Log.v("@@@@@@@@@@@@@@@@@@@@", "DoScan.stopthread"); 
      runner.requestStop(); 
      runner = null; 
    } 

}

希望這有助於..

+0

確定我已經在OnCreate中加入的代碼本peice的 - > MT =新MyThread的();我正在設置變量完成在我的停止按鈕onclicklistener - > mt.finished = true;並且它沒有效果 – abhishek 2011-03-24 08:44:00

+0

我應該在這之後再打電話通知嗎?我已經嘗試過所有可能的語法情況,但我仍然無法處理進度條永不停止的問題 – abhishek 2011-03-24 08:46:17