gpt4 book ai didi

Android Handler.postDelayed 中断声音播放

转载 作者:行者123 更新时间:2023-12-03 02:14:55 28 4
gpt4 key购买 nike

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

     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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com