为什么我在SimpleDateFormat中获得ANR?

时间:2018-05-22 12:43:38

标签: java android timestamp simpledateformat android-anr-dialog

我正在显示通知和通知有时间戳。我正在使用以下代码将时间戳转换为日期格式:

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)错误。我在SimpleDateFormat sdf = new SimpleDateFormat(pattern);收到错误(ANR)。这是错误日志:

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)

问题是什么?

1 个答案:

答案 0 :(得分:0)

根据JavaDoc

,SimpleDateFormat不是线程安全的
  

日期格式未同步。建议为每个线程创建单独的格式实例。如果多个线程同时访问格式,则必须在外部进行同步。

getTimeFormat(Long unixSeconds, String pattern)中删除 static ,并为每个帖子创建一个新对象。