当我播放一些网络剪辑时出现 ANR,我无法处理来自 MediaPlayer 的错误消息。我可以处理来自系统的 ANR 消息并更改对话框吗?默认对话框对用户来说并不舒适。
问问题
561 次
1 回答
2
您无法在自己的应用程序中处理 ANR。您应该尽力避免 ANR。
根据 Android 开发指南页面,ANR 由以下条件触发:
- 5 秒内对输入事件(如按键或屏幕触摸事件)无响应。
- 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 回答