【问题标题】:Why am I getting ANR in SimpleDateFormat?为什么我在 SimpleDateFormat 中得到 ANR?
【发布时间】:2018-11-01 05:50:58
【问题描述】:

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

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)

有什么问题?

【问题讨论】:

  • 在后台线程上执行
  • 是的..我可以做到..但问题是什么?我也有类似的日历问题。检查这个问题stackoverflow.com/questions/49526832/…
  • 当主线程被阻塞时你会得到这个

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


【解决方案1】:

根据JavaDoc,SimpleDateFormat 不是线程安全的

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

getTimeFormat(Long unixSeconds, String pattern) 中移除static,并为每个线程创建一个新对象。

【讨论】:

  • 我在主线程(UI)中调用它。而且我确定我不会从任何其他线程调用此方法。所以不应该有任何同步问题。如果我错了,请纠正我。
猜你喜欢
  • 2010-11-04
  • 2016-07-19
  • 2019-03-05
  • 1970-01-01
  • 1970-01-01
  • 2023-01-02
  • 2023-01-23
相关资源
最近更新 更多