0

我有我的主要 Activity 类、一个 Renderer 类和我的自定义 soundPool 类(称为 soundMan),我可以在我的 Activity 类中创建和访问 SoundPool(IE 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);


}

}

我可以像这样(在 onCreate 中)在我的 Activity 类中创建和使用一个对象:

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

但是,我希望能够从我的渲染线程中执行与上述相同的操作

我知道我可以将我的 Activity 类中的 soundMan 对象设置为静态并像这样使用它:

MainActivity.soundPlay.PlaySound();

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

同样,示例(带有代码)将不胜感激。

4

1 回答 1

1

尝试这个

在里面调用它runonUIthread

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

                }
            });

或者

在您的活动中创建一个处理程序。并使用Handler、post方法更新UI元素的结果

编辑: 处理程序示例

像这样创建一个处理程序

Handler handler; <-- 声明为字段

并且在onCreate()

handler=new Handler(); 

<--Handler的初始化

……

然后在你的线程中。

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

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

于 2013-05-06T00:58:13.623 回答