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

Dwe*_*ron 6 java android android-audiomanager android-handler

我正在尝试以编程方式将卷提升到STREAM_MUSIC流的最大值,但是当我这样做时,我正在"向死机线程上的处理程序发送消息".此外,它似乎没有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!"); 
Run Code Online (Sandbox Code Playgroud)

在谷歌搜索后,似乎这个错误与多线程情况有关......此时的代码应该在UI线程上运行.

事实上,我甚至把它包围着:

runOnUiThread(new Runnable() {

    public void run() {
        // code_goes_here
    }
});
Run Code Online (Sandbox Code Playgroud)

而且,这产生了同样的错误.我看到的错误是这样的:

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!
Run Code Online (Sandbox Code Playgroud)

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

Dee*_*ala 3

您的问题可能与此线程上报告的问题有关 - onPostExecute 未在 AsyncTask 中调用(处理程序运行时异常)

音频焦点更改的显示正在触发 android 无法完成的 UI 事件。目前尚不清楚为什么会出现这种情况。也许音频管理器是在一个上下文中获得的,而显示音量的 toast 在另一个上下文中执行?一个快速而肮脏的更改是将标志交换为 FLAG_VIBRATE 并检查这是否会产生影响。这会将问题范围缩小到 UI 更新,然后您就可以进行处理。

  • AsyncTasks 在从后台线程实例化时遇到了这个问题。如果程序中的第一个异步任务不是从 UI 线程实例化的,则会出现此问题。AudioManager *可能*会遇到类似的问题。验证 - 为您的应用程序创建一个应用程序类;在 android 清单上注册它;并从 onCreate() 方法获取音频管理器系统服务。这可能会正确实例化内部循环器和处理程序。 (2认同)