Android 如何从main/UI以外的线程访问声音池?

Android 如何从main/UI以外的线程访问声音池?,android,handle,soundpool,worker,ui-thread,Android,Handle,Soundpool,Worker,Ui Thread,我有我的主活动类、渲染器类和自定义声音池类(称为soundMan),我可以在我的活动类中创建和访问声音池(即soundMan)对象,而不会出现太多问题 但是,这对我来说并没有多大好处,我从运行在单独线程上的Renderer类(GLSurfaceView.Renderer)中的资源创建了所有对象 因此,当我尝试从渲染器类创建一个新的soundPool(soundMan)对象时,我得到一个错误“无法在未调用looper.prepare()的线程内创建处理程序” 我肯定有办法解决这个问题,但我想不出来

我有我的主活动类、渲染器类和自定义声音池类(称为soundMan),我可以在我的活动类中创建和访问声音池(即soundMan)对象,而不会出现太多问题

但是,这对我来说并没有多大好处,我从运行在单独线程上的Renderer类(GLSurfaceView.Renderer)中的资源创建了所有对象

因此,当我尝试从渲染器类创建一个新的soundPool(soundMan)对象时,我得到一个错误“无法在未调用looper.prepare()的线程内创建处理程序”

我肯定有办法解决这个问题,但我想不出来。任何帮助都将不胜感激

下面是代码和示例

我的自定义声音池类

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

但是,我希望能够通过我的渲染线程执行与上面相同的操作

我知道我可以将活动类中的soundMan对象设置为静态,并按如下方式使用它:

MainActivity.soundPlay.PlaySound();
但这显然不是实现我所追求的目标的好方法

再次感谢您提供示例(带代码)。

试试这个

在内部调用它
runonUIthread

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

                }
            });

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

编辑: 处理程序示例

创建这样的处理程序


Handler
Hi@Pragnani谢谢,我确实尝试了runOnUiThread,起初,虽然我没有收到任何错误,但声音不会播放,然后每次我运行应用程序时,应用程序都会因为某种原因崩溃-你能发布你提到的“处理程序”方法的代码示例吗?我确实读过这篇文章,但找不到一个清晰的例子-感谢againThank you@Pragnani提供了更新的代码-抱歉,还有一个问题,我的Renderer类不是Activity类的内部类。它位于一个单独的文件中,因此如何从渲染器类访问在活动类中创建的处理程序?再次感谢。@Zippy我现在已经清楚地了解了您的代码,为什么要为活动创建对象?其次,SoundPool必须是构造函数和更新UI中的普通类和传递处理程序。我已经创建了一个自定义类(稍后将对其进行修改和改进-目前,它只是一个将播放示例的基本类),因此我正在创建一个对象,以便它能够使用它。我不确定您所说的“SoundPool必须是构造函数中的普通类和传递处理程序,并在那里更新UI”=谢谢again@Zippy你只想在第二节课上演奏声音吗?然后去服务。我的意思是不允许你为活动创建对象,Android会用它的生命周期方法来处理这个问题。所以不要为活动创建对象。
MainActivity.soundPlay.PlaySound();
 runOnUiThread(new Runnable() {
                public void run() {
                   //do stuff

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