Java AudioManager正在向死线程上的处理程序发送消息?

Java AudioManager正在向死线程上的处理程序发送消息?,java,android,android-audiomanager,android-handler,Java,Android,Android Audiomanager,Android Handler,我试图通过编程将音量提高到STREAM\u MUSICSTREAM的最大值,但在这样做时,我遇到了“在死线程上向处理程序发送消息”的问题。而且,它似乎不会在100%的时间内提高音量,尽管当我遇到这个错误时,它会在大部分时间内提高音量 代码是: System.out.println("Maximum volume for this stream is: "+maxstreamvol+" and it used to be set to: "+currentvol); final Audi

我试图通过编程将音量提高到
STREAM\u MUSIC
STREAM的最大值,但在这样做时,我遇到了“在死线程上向处理程序发送消息”的问题。而且,它似乎不会在100%的时间内提高音量,尽管当我遇到这个错误时,它会在大部分时间内提高音量

代码是:

System.out.println("Maximum volume for this stream is: "+maxstreamvol+" and it used to be set to: "+currentvol);     
final AudioManager am = (AudioManager)this.getSystemService(Context.AUDIO_SERVICE);
am.setStreamVolume(AudioManager.STREAM_MUSIC, maxstreamvol, AudioManager.FLAG_SHOW_UI);
am.setStreamSolo(AudioManager.STREAM_MUSIC, true);
System.out.println("Volume Raised!"); 
在谷歌搜索之后,这个错误似乎与多线程情况有关。。。此时的代码应该在UI线程上运行

事实上,我甚至在它周围写了:

runOnUiThread(new Runnable() {

    public void run() {
        // code_goes_here
    }
});
这就产生了同样的错误。我看到的错误是:

I/System.out(24949): Maximum volume for this stream is: 15 and it used to be set to: 0
W/MessageQueue(  490): Handler (android.media.AudioManager$FocusEventHandlerDelegate$1) {42b52f28} sending message to a Handler on a dead thread
W/MessageQueue(  490): java.lang.RuntimeException: Handler (android.media.AudioManager$FocusEventHandlerDelegate$1) {42b52f28} sending message to a Handler on a dead thread
W/MessageQueue(  490):  at android.os.MessageQueue.enqueueMessage(MessageQueue.java:294)
W/MessageQueue(  490):  at android.os.Handler.enqueueMessage(Handler.java:618)
W/MessageQueue(  490):  at android.os.Handler.sendMessageAtTime(Handler.java:587)
W/MessageQueue(  490):  at android.os.Handler.sendMessageDelayed(Handler.java:558)
W/MessageQueue(  490):  at android.os.Handler.sendMessage(Handler.java:495)
W/MessageQueue(  490):  at android.media.AudioManager$1.dispatchAudioFocusChange(AudioManager.java:1894)
W/MessageQueue(  490):  at android.media.IAudioFocusDispatcher$Stub.onTransact(IAudioFocusDispatcher.java:57)
W/MessageQueue(  490):  at android.os.Binder.execTransact(Binder.java:351)
W/MessageQueue(  490):  at dalvik.system.NativeStart.run(Native Method)
I/System.out(24949): Volume Raised!

有人知道这里发生了什么吗?

您的问题可能与此线程中报告的问题有关-


音频焦点更改的显示正在触发android无法完成的UI事件。目前尚不清楚为什么会出现这种情况。也许音频管理器是在一个上下文中获得的,而toast显示卷是在另一个上下文中执行的?一个快速而肮脏的改变是用flag_振动来交换flag_振动,并检查这是否有区别。这会将问题缩小到用户界面更新,然后您就可以进行更新。

AudioManager使用创建的线程调用回调或进行用户界面操作(显示卷toast等)。
(通过或,请参阅)

因此,您应该确保第一次调用
Context.getSystemService(AUDIO\u MANAGER)
发生在UI线程上。
(不确定子序列调用是否会重用该实例,但即使我重新检索AudioManager,异常仍会发生)


我今天遇到了这个问题,并通过将该调用添加到我的应用程序中解决了它。onCreate()。(与答案有点类似?

您是否要求代码中的音频焦点?还可以尝试使用
applicationContext
,例如
(AudioManager)getApplicationContext().getSystemService(Context.AUDIO\u服务)我尝试了这个,并进行了测试。它使处理程序崩溃消失,但它仍然不让我可靠地提高音频…编辑:原来音频不提高是我自己的错,因为我造成了比赛条件!哎呀!(我刚才忘了编辑这个)实际上,我刚刚添加了AudioManager.FLAG\u SHOW\u UI以确保音频被正确提升。以前,我使用“0”标记调用setStreamVolume。真的,我希望这一切都发生在幕后,所以我不介意我是否必须回到标志“0”。。。。但这两种方式似乎都不能100%工作,0或AudioManager.FLAG_SHOW_UI上的标志似乎会产生相同的结果,当然一个有UI指示,一个没有。AudioManager是否在应用程序中的其他位置被请求?我假设您最初发布的代码片段来自某个活动。我深入研究了Impl代码,发现音频管理器使用一个内部循环器和处理程序来提醒框架音频焦点的变化。我想知道使用错误上下文缓存的内部处理程序是否会导致此问题。我不确定。。。但这是可能的。如果是,我将如何检查和/或修复它?每当我调用setStreamVolume时,前一行总是:final AUDIO Manager am=(AUDIO Manager)getApplicationContext().getSystemService(Context.AUDIO_SERVICE);AsyncTasks在从后台线程实例化时出现此问题。如果程序中的第一个异步任务不是从UI线程实例化的,则会出现此问题。音频经理可能会遭受类似的痛苦。验证-为应用程序创建应用程序类;在android清单上注册;并从onCreate()方法获取audio manager系统服务。这可能会正确实例化内部循环器和处理程序。您不必使用此实例。仅使用正确的上下文实例化它就可以了,因为这样可以在音频管理器中正确设置处理程序。下次使用应用程序上下文获取音频服务应该可以解决处理程序问题,并且从您的其他注释中可以看出,该错误不再发生。可靠地提升音频本身就是另一个问题。如果您为此提出另一个问题,并发布更多关于如何获得maxstream卷的代码等,可能会更好。