java - 为什么我在 SimpleDateFormat 中得到 ANR?
问题描述
我正在显示通知,通知有时间戳。我正在使用以下代码将时间戳转换为日期格式:
public static String getTimeFormat(Long unixSeconds, String pattern) {
//Example EEE MMM dd HH:mm:ss z yyyy;
Date date = new Date(unixSeconds);
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
sdf.setTimeZone(timeZone);
return sdf.format(date);
}
我正在传递时间戳和模式(“MMM”或“dd”或“yyyy”)。当我显示 100 个通知时,每个通知调用此方法 100 次以显示通知时间。在 Android 中,如果 Android 应用程序的主线程 (UI) 阻塞时间过长,则会触发“应用程序无响应”(ANR) 错误。我收到错误(ANR)SimpleDateFormat sdf = new SimpleDateFormat(pattern);
。这是错误日志:
Caused by: com.github.anrwatchdog.ANRError: Application Not Responding
Caused by: com.github.anrwatchdog.ANRError$$$_Thread: main
at java.lang.Object.internalClone(Native Method)
at java.lang.Object.clone(Object.java:241)
at java.text.Format.clone(Format.java:258)
at java.text.NumberFormat.clone(NumberFormat.java:599)
at java.text.DecimalFormat.clone(DecimalFormat.java:1095)
at java.text.SimpleDateFormat.initialize(SimpleDateFormat.java:695)
at java.text.SimpleDateFormat.<init>(SimpleDateFormat.java:623)
at java.text.SimpleDateFormat.<init>(SimpleDateFormat.java:598)
问题是什么?
解决方案
根据JavaDoc,SimpleDateFormat 不是线程安全的
日期格式不同步。建议为每个线程创建单独的格式实例。如果多个线程同时访问一个格式,它必须在外部同步。
从每个线程中删除静态getTimeFormat(Long unixSeconds, String pattern)
并创建一个新对象。
推荐阅读
- bash - Shell 脚本:将变量传递给 spark-shell 会话
- ruby-on-rails - 将两个 ActiveRecord 关联集合合并为单个关联集合
- php - 获取订单中每个产品的 SKU
- sql - 在多个表上选择,这是另一个选择的结果
- r - 大型数据集的 Shiny App 计算非常慢
- typescript - 从应用程序包中排除本地 TypeScript 库
- mongodb - 将所有文档放在一个数组中
- java - Jodatime IllegalInstantException
- google-apps-script - 脚本难度中的公式
- node.js - 处理输入文件后让 Node.js 与数据库断开连接的正确调用顺序