Почему я получаю ANR в SimpleDateFormat? - PullRequest
0 голосов
/ 22 мая 2018

Я показываю уведомления, и уведомления имеют метку времени.Я конвертирую метку времени в формат даты, используя следующий код:

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);
}

Я передаю метку времени и шаблон («МММ» или «ДД» или «ГГГГ»).Этот метод вызывается 100 раз по одному для каждого уведомления, чтобы отобразить время уведомления, поскольку я отображаю 100 уведомлений.В Android, если основной поток (UI) приложения Android блокируется слишком долго, возникает ошибка «Приложение не отвечает» (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)

В чем проблема?

1 Ответ

0 голосов
/ 22 мая 2018

SimpleDateFormat не является потокобезопасным в соответствии с JavaDoc

Форматы даты не синхронизированы.Рекомендуется создавать отдельные экземпляры формата для каждого потока.Если несколько потоков обращаются к формату одновременно, он должен быть синхронизирован извне.

Удалить static из getTimeFormat(Long unixSeconds, String pattern) и создать новый объект для каждого потока.

...