2014-12-03 70 views
0

我正在嘗試更新關於MediaPlayer中歌曲進度的seekbar。 我正在使用線程來完成這項任務。無法使用Handler更新seekbar

首先,我已經使用了Thred內部線程並嘗試更新UI,但它使應用程序崩潰並且說只有原始線程可以附加到視圖。

然後,我嘗試使用線程runnable中的處理程序更新它。這工作正常,但它並沒有更新seekbar。當我做了日誌,然後我知道循環不會在我的處理程序中進行。我不知道問題在哪裏。請幫我更新SeekBar。

代碼:

private Runnable mUpdateTimeTask = new Runnable() { 
    public void run() { 
     try { 
      if ((musicPath != mIRemoteService.getPath())) { 
       System.out.println("..... MUSIC CHANGE....."); 
       setOrUpdateData(); 
       updateFragmentLayout();  

      } 

      // Displaying Current Duration time/Progress 

      new Handler().post(new Runnable() { 
       @Override 
       public void run() { 
        try { 
         songCurrentDurationLabel.setText(""+ Utilities.milliSecondsToTimer(mIRemoteService.position())); 
         songProgressBar.setProgress((int)mIRemoteService.position()); 
         System.out.println("Runnnnn........."); 
         //songProgressBar.invalidate(); 
        } catch (RemoteException e) { 
         e.printStackTrace(); 
         System.out.println("Runnnnn......... EXCEPTION...."); 
        } 

       } 
      }); 
      System.out.println("Runnnnn.........MAIN...."); 

      if (!(mIRemoteService.isPlayerRunning())) { 
       btnPlay.setImageDrawable(getResources().getDrawable(R.drawable.play_now_playing)); 
       mHandler.removeCallbacks(mUpdateTimeTask); 
       System.out.println("Runnnnn.........MAIN....IF"); 

      }else{ 
       System.out.println("Runnnnn.........MAIN....ELSE"); 
       mHandler.post(mUpdateTimeTask);  
      } 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
}; 
+0

你得到任何形式的錯誤?如果沒有放置一些日誌,看看代碼的流程是什麼,如果它被卡住或者沒有輸入if語句 – 2014-12-03 06:18:42

+0

@GoranHoriaMihail如果我使用Thread來代替Handler,那麼我得到錯誤「只有創建的原始線程視圖層次結構可以觸及其視圖。「 – 2014-12-03 06:45:19

+0

是的,你不能觸及除UI線程以外的其他線程的任何視圖。處理程序將在UI線程上發佈修改,這就是爲什麼它的工作原理,是的你應該使用處理程序。現在使用處理程序時出現什麼錯誤/問題? – 2014-12-03 06:59:45

回答

3

,你可以使用一個處理器或線程,與線程你應該確保張貼在UI線程上的修改:

private class UpdateSeekBar extends Thread 
{ 
    @Override 
    public void run() 
    { 
     super.run(); 

     while (null != mp && mp.isPlaying() && this.isAlive()) 
     { 
      //final int min = (mp.getCurrentPosition()/1000)/60; 
      //final int sec = (mp.getCurrentPosition()/1000) % 60; 

      MainActivity.this.runOnUiThread(new Runnable() 
      { 
       @Override 
       public void run() 
       { 
        try 
        { 
         songCurrentDurationLabel.setText("" + Utilities.milliSecondsToTimer(mIRemoteService.position())); 
         songProgressBar.setProgress((int) mIRemoteService.position()); 
         System.out.println("Runnnnn........."); 
         // songProgressBar.invalidate(); 
        } 
        catch (RemoteException e) 
        { 
         e.printStackTrace(); 
         System.out.println("Runnnnn......... EXCEPTION...."); 
        } 
       } 
      }); 

      try 
      { 
       Thread.sleep(1000); 
      } 
      catch (InterruptedException e) 
      { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 
+0

感謝您的回答。請讓我知道如何讓它順利。我的意思是現在它每1秒更新一次。現在我刪除Thread.Sleep(1000),然後它將非常快速和平滑地運行,並且它也掛起另一個UI。 – 2014-12-03 10:25:57

+0

現在,seekbar每秒更新1次。你可以嘗試使用Thread.Sleep(500),看看會更好。 – 2014-12-03 10:30:26

+0

你的答案是完美的工作和更新進度條。但是在UI線程中發生了一些繁重的工作。因爲它影響到我的其他UI部分。如果玩家處於遊戲狀態,我無法順利工作。如果播放器處於暫停狀態意味着當時沒有線程正在運行,那麼在這種情況下,所有的UI都可以正常工作......你知道是什麼導致了這個問題......? – 2014-12-04 12:40:26