您好我收到ANR(应用程序无响应)错误但我无法理解原因。如果我点击“等待”,一切都很完美,ANR就不再回来了。
现在,我知道使用MediaPlayer作为服务时,使用.prepareAsync和onPrepared()方法而不是简单的.prepare()和.start()是一种很好的做法。它不会锁定UI线程并且运行良好。
问题在于打开文件时你的所有ANR都没有发生(你会猜到更高的处理器),但是当它们正在播放时以及当cpu最多只有几个%时会随机发生。正如我之前提到的,NOTHING远非接近无响应,并且UI线程上几乎没有。
唯一的线索是我第一次播放曲目时没有得到ANR,但只有在它被改变之后。我认为prepareAsync线程发生冲突,我自己添加了一个锁。没有变化。
我每次尝试在开始新曲目之前发布媒体播放器。没有变化
我尝试在许多序列中重置,停止等。没有变化。
有没有人经历过同样的事情?
作为一种解决方法,有没有办法自动解除ANR?我知道这不是答案,但我找不到任何选择。我在一个有根据的平板电脑(我编译了ROM),它只适用于我自己 - 没有分发
谢谢
答案 0 :(得分:1)
标准服务实际上在主线程上运行,如果您看到ANR,也许您应该将整个MediaPlayer移动到另一个线程。引用documentation
关于Service类的大多数混淆实际上都围绕着它不是:
- 服务不是一个单独的流程。
- 服务不一个帖子。它本身不是从主线程开始工作的手段(以避免应用程序无响应错误)。
您已使用prepareAsync()
,但正如您所述,MediaPlayer正在运行时发生错误,而不是准备。如果没有关于究竟是什么导致ANR的更多细节,我相信切换到HandlerThread是您的最佳选择。