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
我使用一种方法将 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