我有我的主要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();
但这显然不是实现我所追求目标的好方法。
再次举例说明(带代码)。
答案 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
}
});
//我在编辑器中输入了它,任何语法错误都会修改它们。