如何从main / UI以外的线程访问soundPool?

时间:2013-05-06 00:55:54

标签: android handle soundpool worker ui-thread

我有我的主要Activity类,Renderer类和我的自定义soundPool类(称为soundMan),我可以在Activity类中创建和访问SoundPool(I.E.soundMan)对象,而不会出现太多问题。

但是,这对我来说不是很好,我从Renderer类(GLSurfaceView.Renderer)中的资源创建了所有对象,该类在一个单独的线程上运行。

因此,当我尝试从我的渲染器类创建一个新的soundPool(soundMan)对象时,我得到错误“无法在没有调用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类中的soundMan对象设置为static并像这样使用它:

MainActivity.soundPlay.PlaySound();

但这显然不是实现我所追求目标的好方法。

再次举例说明(带代码)。

1 个答案:

答案 0 :(得分:1)

试试这个

runonUIthread

中调用它
 runOnUiThread(new Runnable() {
                public void run() {
                   //do stuff

                }
            });

在您的活动中创建一个Hanlder。并使用Handler,post方法更新UI元素的结果

修改 处理程序示例

像这样创建一个处理程序

Handler handler;< - 作为字段的声明

并在onCreate()

handler=new Handler(); 

< - 处理程序的初始化

...

然后在你的主题中。

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

//我在编辑器中输入了它,任何语法错误都会修改它们。