0

当我播放一些网络剪辑时出现 ANR,我无法处理来自 MediaPlayer 的错误消息。我可以处理来自系统的 ANR 消息并更改对话框吗?默认对话框对用户来说并不舒适。

4

1 回答 1

2

您无法在自己的应用程序中处理 ANR。您应该尽力避免 ANR。

根据 Android 开发指南页面,ANR 由以下条件触发:

  1. 5 秒内对输入事件(如按键或屏幕触摸事件)无响应。
  2. BroadcastReceiver 没有在 10 秒内完成执行。

因此,您应该查看 logcat 跟踪和 ANR 跟踪以定位 ANR 发生的位置,并检查源代码以查找可能阻塞主线程的任何可能的“长时间运行的操作”。

尽量使用AsyncTask在后台承载任务,避免ANR,Android官网推荐。以下载为例:

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
    // Do the long-running work in here
    protected Long doInBackground(URL... urls) {
        int count = urls.length;
        long totalSize = 0;
        for (int i = 0; i < count; i++) {
            totalSize += Downloader.downloadFile(urls[i]);
            publishProgress((int) ((i / (float) count) * 100));
            // Escape early if cancel() is called
            if (isCancelled()) break;
        }
        return totalSize;
    }

    // This is called each time you call publishProgress()
    protected void onProgressUpdate(Integer... progress) {
        setProgressPercent(progress[0]);
    }

    // This is called when doInBackground() is finished
    protected void onPostExecute(Long result) {
        showNotification("Downloaded " + result + " bytes");
    }
}

要执行此工作线程,只需创建一个实例并调用 execute():

new DownloadFilesTask().execute(url1, url2, url3);
于 2013-09-02T03:09:23.203 回答