2013-05-06 78 views
0

我有我的主要活動類,一個Renderer類和我的自定義soundPool類(稱爲soundMan),我可以在我的Activity類中創建和訪問SoundPool(I.E. soundMan)對象,而沒有太多問題。如何從主/用戶界面以外的線程訪問soundPool?

但是,這對我來說並不好,我從我的Renderer類(GLSurfaceView.Renderer)中的資源創建了所有的對象,這些對象正在單獨的線程上運行。

所以,當我試圖從我的渲染器類中創建一個新的Soundpool(錄音師)對象,我得到錯誤「無法創建內螺紋處理程序尚未調用looper.prepare()」

我我確定一定有辦法解決這個問題,但我無法解決這個問題。任何幫助,將不勝感激。

代碼及實例遵循

我的自定義的Soundpool類

public class soundMan extends Activity { 

//Simple soundPool class 

private SoundPool soundPool; 
private int soundID; 

soundMan(Context myContext){ 
    soundPool = new SoundPool(3, AudioManager.STREAM_MUSIC, 0); 
    soundID = soundPool.load(myContext, R.raw.matches, 1);  

} 

public void PlaySound(){ 

    soundPool.play(soundID, 0.9f, 0.9f, 1, 0, 0); 


} 

} 

我可以創建和我的Activity類中使用的對象,像這樣(在的onCreate):

soundMan soundPlay = new soundMan(this); //Create object 
soundPlay.PlaySound();     //Play the sound 

不過,我希望能夠做同樣的上述但是從我渲染線程

我知道我可以在我的Activity類設置我的錄音師對象靜態和使用它像這樣:

MainActivity.soundPlay.PlaySound(); 

但是,這顯然不是一個很好的方式來實現我所追求的。

再次,示例(帶代碼)將不勝感激。

回答

1

試試這個

調用它裏面runonUIthread

runOnUiThread(new Runnable() { 
       public void run() { 
        //do stuff 

       } 
      }); 

在你的活動創建一個Hanlder。並使用處理程序,POST方法來更新UI元素的結果

編輯: 處理程序例如

像這樣創建

Handler handler; <處理程序 - 聲明作爲現場

和in onCreate()

handler=new Handler(); 

< - 處理程序的初始化

......

然後在你的線程中。

handler.post(new Runnable() 
{ 
public void run() 
{ 
//update your UI here 
} 
}); 

//我在編輯器中輸入了它,任何語法錯誤都會修改它們。

+0

嗨@Pragnani謝謝,我確實嘗試了runOnUiThread,並且最初,儘管我沒有得到任何錯誤,聲音也不會播放,但是每當我出於某種原因運行它時,應用程序都會崩潰 - 您能不能請發佈您提到的'Handler'方法的代碼示例?我沒有讀到這個,但找不到一個明確的例子 - 再次感謝 – Zippy 2013-05-06 01:02:46

+0

@Zippy更新代碼,檢查一次 – Pragnani 2013-05-06 01:12:29

+0

謝謝@Pragnani更新的代碼 - 抱歉,另外一個問題,我的Renderer類不是我的內部類活動類。它在一個單獨的文件中,那麼我如何訪問我的渲染器類中的Activity類中創建的處理程序?再次感謝。 – Zippy 2013-05-06 01:14:37

相關問題