Android Handler.postDelayed 中断声音播放

标签 android audio android-animation android-mediaplayer

我正在使用此代码播放声音

     final MediaPlayer mp = MediaPlayer.create(this, R.raw.sound);
        mp.setOnCompletionListener(new OnCompletionListener() {

            @Override
            public void onCompletion(MediaPlayer mp) {
                mp.release();
            }

        });  

它本身可以正常工作,但是在我添加了一个扩展 ImageView 的动画后出现了问题,该动画以大约 30 毫秒的间隔刷新(通过调用 handler.postDelayed)图像资源以创建动画。问题是当动画开始时,它会终止声音的播放。这是刷新 ImageView 的 Runnable 的代码。
 private Runnable runnable = new Runnable () {


public void run() {
    String name = "frame_" + frameCount;
    frameCount ++;
    int resId = mContext.getResources().getIdentifier(name, "drawable", mContext.getPackageName());
    imageView.setImageResource(resId);  
    if(frameCount < totalFrameCount) {
        mHandler.postDelayed(runnable, interval);
    }       
}

};

我还尝试使用调用 anmiationView.postInvalidate 的线程来执行动画,但是它有同样的问题。请帮忙。谢谢

编辑:
看起来问题是由于动画被调用的时间。之前我在 Activity 的 onActivityResult 中调用它。看起来这不是打电话的正确地方。现在我将动画 View 放在一个弹出窗口中并在那里播放,它可以正常工作。不知道究竟是为什么。

最佳答案

在处理程序的评论中:

“处理程序允许您发送和处理 {@link Message} 和 Runnable
与线程的 {@link MessageQueue} 关联的对象。每个处理程序
实例与单个线程相关联,并且该线程的消息
队列。当你创建一个新的 Handler 时,它被绑定(bind)到线程/
创建它的线程的消息队列——从那时起,
它将消息和可运行文件传递到该消息队列并执行
当他们从消息队列中出来时。”

所以,问题可能是动画和媒体播放操作都在
哪个线程拥有相同的消息队列创建处理程序(假设是主线程)。

如果动画永远循环,那么媒体播放器将几乎没有机会运行。

您可以尝试使用 HandlerThread,该线程将包含一个新的 looper 用于
从它创建的处理程序,添加到该处理程序的所有可运行对象都将在另一个处理程序中运行
个别线程。

动画线程和媒体播放线程应该在不同的线程中运行,而不是
调度在同一个。

希望能帮助到你。

HandlerThread 的用法和一些讨论看起来像这样:

How to create a Looper thread, then send it a message immediately?

关于Android Handler.postDelayed 中断声音播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20832842/

相关文章:

javascript - 如何切换dom音频元素

android - 翻译 X 动画无论持续时间如何都会立即结束

android - 在 ImageView 中为 scaleType ="centerCrop"设置动画

android - 如何倾斜按钮及其文本......?

jquery - jQTouch 不再支持 Android?

android - 条形图使用aChartEngine 设置显示图表值

iphone - iOS SDK - iPhone 音频插孔如何与连接的电缆交互?

c - 如何让音频听起来更好? (C+FFMpeg音频生成示例)

android - 如何在 RecyclerView 中显示确切的项目数量?

android - ionic 无法构建项目