AudioManager sending message to a Handler on a dead thread?

风流意气都作罢 提交于 2019-12-08 19:41:41

问题


I am trying to programmatically raise the volume to the STREAM_MUSIC stream's maximum value, but I am having a "Sending message to a Handler on a dead thread" issue when I do. Also, it seems like it does not raise the volume 100% of the time, although when I get this error, it will raise it MOST of the time.

The code is:

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!"); 

After googling around, it seems that this error has to do with multi-threaded situations... The code at this point should be running on the UI thread.

In fact, I even surrounded it with:

runOnUiThread(new Runnable() {

    public void run() {
        // code_goes_here
    }
});

And, that produced the same error. The error that I am seeing is this:

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!

Does anybody know what's happening here?


回答1:


Your problem may be related to the one reported on this thread - onPostExecute not being called in AsyncTask (Handler runtime exception)

The display for the audio focus change is triggering a UI event that android is not able to complete. It is not immediately clear why this is the case. Perhaps the audio manager was obtained with one context and the toast to show the volume is executed in another context ? A quick and dirty change is to swap the flag for FLAG_VIBRATE and check if that makes a difference. That would narrow down the problem to a UI update which you can then work on.




回答2:


AudioManager uses the thread which it was created to invoke your callback or do UI manipulating (display Volume toast etc.)
(Via Looper.myLooper or getMainLooper, see this).

So you should make sure your first call to Context.getSystemService(AUDIO_MANAGER) happens on the UI thread.
(Not sure that subsequence calls will reuse that instance, but even if I re-retrieve the AudioManager the exception still occur)

I've come across this issue today and solved it by adding that call to my Application.onCreate(). (Somewhat similar to this answer?)



来源:https://stackoverflow.com/questions/15349349/audiomanager-sending-message-to-a-handler-on-a-dead-thread

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!