3

嗨,我收到 ANR(应用程序无响应)错误,但我不明白为什么。如果我单击“等待”,一切都会正常运行,并且 ANR 不会再回来了。

现在,我知道当使用 MediaPlayer 作为服务时,使用 .prepareAsync 和 onPrepared() 方法而不是简单的 .prepare() 和 .start() 是一种很好的做法。它不会锁定 UI 线程并且效果很好。

问题是我所有的 ANR 在打开文件时都没有发生(你会猜到那里有更高的处理器),而是在播放时随机发生并且 cpu 最多只有几个 %。正如我之前提到的,NOTHING 几乎没有响应,并且 UI 线程上几乎没有剩下什么。

唯一的线索是我第一次播放曲目时没有收到 ANR,但只有在更改曲目后才会收到 ANR。我认为 prepareAsync 线程正在发生冲突,我自己添加了一个锁。没变。

每次开始新曲目之前,我都会尝试释放媒体播放器。没变

我尝试在许多序列中重置、停止等。没变。

有没有人经历过同样的事情?

作为一种解决方法,有没有办法自动关闭 ANR?我知道这不是答案,但我找不到任何选择。我在一个有根的平板电脑上(我编译了 ROM),它仅供我自己使用 - 没有分发

谢谢

4

1 回答 1

2

标准服务实际上在主线程上运行,如果您看到 ANR,也许您应该将整个 MediaPlayer 移动到另一个线程。引用文档

关于 Service 类的大多数困惑实际上都围绕着它不是什么:

  • 服务不是一个单独的进程。
  • 服务不是线程。它本身并不是一种脱离主线程工作的方法(以避免应用程序无响应错误)。

您已经在使用prepareAsync(),但正如您所说的错误发生在 MediaPlayer 正在运行而不是准备时。如果没有更多关于究竟是什么导致 ANR 的详细信息,我相信切换到 HandlerThread 是您的最佳选择。

于 2013-03-26T20:02:55.947 回答