Android N 上的 SimpleDateFormat 冻结应用程序

SimpleDateFormat freeze application on Android N

我使用一种方法将 Date 的列表转换为 String 以显示给用户。此方法在 API < 24 上运行良好,但当我在 Android N 下的设备(设备是三星 SMT-580)上使用它时,它会冻结我的应用程序。

这是我的方法:

protected List<String> getValidPeriods() {
    ArrayList<String> validPeriods = new ArrayList<>();
    Date startDate = isSnis() ? Config.snisStartDate() : Config.dashboardsStartDate();
    Date endDate = new Date();

    Calendar calendar = Calendar.getInstance();
    calendar.setTime(startDate);

    while(calendar.getTime().before(endDate)){
        validPeriods.add(DateUtils.format(calendar.getTime(), PERIOD_FORMAT));
        calendar.add(Calendar.MONTH, 1);
    }

    return validPeriods;
}

其中PERIOD_FORMAT

public static final String PERIOD_FORMAT = "MMMM yyyy";

DateUtils.format() 方法是:

public static String format(Date date, String format) {
    if (date != null)
        return new SimpleDateFormat(format, Locale.getDefault()).format(date);
    return "";
}

我可以说这是引发问题的日期格式,因为删除行 return new SimpleDateFormat(format, Locale.getDefault()).format(date); 并将其替换为硬编码值会停止冻结应用程序。另一个指标是我们可以看到它在方法跟踪期间花费了 48.9% 的时间:

知道为什么吗?


更新#1 另外,它的格式不正确。它应该给出 "November 2016" 而它给出 "November 0008"。也许这是相关的。

我在下面导入时遇到了同样的问题

android.icu.text.SimpleDateFormat