2012-05-07 24 views
1

一些用戶越來越有我就行threadAudio.start(APP)ANR錯誤使用線程

private void startAudio(int audioId) { 

    mPlayer = MediaPlayer.create(this, audioId); 

    mPlayer.setOnCompletionListener(new OnCompletionListener() { 

     @Override 
     public void onCompletion(MediaPlayer mp) { 
      mp.stop(); 
      mp.release(); 
      mPlayer = null; 
     } 
    }); 

    mPlayer.start(); 
    vSeek.setMax(mPlayer.getDuration()); 

    threadAudio = new Thread(thread); 
    threadAudio.start(); 
} 

public Runnable thread = new Runnable() { 
    public void run() { 
     try { 
      while(mPlayer != null){ 
       int currentPosition = mPlayer.getCurrentPosition(); 
       Message msg = new Message(); 
       msg.what = currentPosition; 
       handler.sendMessage(msg); 
      } 
      Thread.sleep(100); 
     } catch (Exception e) { 
     } 
    } 
}; 

private Handler handler = new Handler() { 
    public void handleMessage(Message msg){ 
     vSeek.setProgress(msg.what); 
    } 
}; 

首先,我不能夠複製我的設備上的錯誤(ANR keyDispatchingTimedOut)錯誤!這可以是設備特定的嗎?

我使用的處理器爲每個機器人文檔的建議,以避免從UI線程以外訪問Android的UI工具包...

或者,也許我不得不線之間的某處調用threadAudio.stop()?

回答

1

我想你的意思是把你的Thread.sleep(100);循環while(mPlayer != null){裏面?從本質上講while循環不斷髮送消息時的軍隊軍隊的處理程序,它運行在UIThread,這是什麼原因造成ANR keyDispatchingTimedOut錯誤:所有的CPU時間要麼花在處理這些消息或用在發送這些消息。沒有一個好地方是:P

+0

任何更好的解決方案? – Hadi

+0

嘗試把了Thread.sleep(100); _within_ while循環,看看它是如何執行。 – Kai

1

這是因爲線程內部有一個never ending while loop ......你應該找到一個更好的方式來完成你的任務......具有較低RAM內存的設備或具有很多應用程序的設備將無法爲此類內存創建內存一個代碼..

+0

我需要搜索條與播放的音頻的時間移動...和音頻停止時,while循環結束...任何更好的解決方案\ – Hadi