我在android上运行此代码后加载了一个带有查询的游标我传递给适配器,但是我的日期是长的毫秒格式,所以我需要在加载适配器之前正确格式化! 问题是这段代码需要14秒才能传递50项加载,如果我在适配器内调用它,问题会变得最糟糕getView导致当我流口水时变慢,如果我把这个功能拿出程序运行顺利
这是我的listfragment中的调用
private String dateFormatPatternEdited(long timeMS) {
android.text.format.DateFormat df = new android.text.format.DateFormat();
final Calendar eDate = Calendar.getInstance();
Calendar sDate = Calendar.getInstance();
sDate.setTimeInMillis(timeMS);
long daysBetween = 0;
while (sDate.before(eDate)) {
sDate.add(Calendar.DAY_OF_MONTH, 1);
daysBetween++;
}
String mDateFormatPattern = FuelTrackerApplication.dateFormat.format(timeMS);
if (daysBetween < 2){
mDateFormatPattern = FuelTrackerApplication.timeFormat.format(timeMS);
} else if(daysBetween < 365){
mDateFormatPattern = df.format(FuelTrackerApplication.dateFormatPattern,timeMS).toString();
}
return mDateFormatPattern;
}
这是我初始化日期格式我将在FuelTrackerApplication中使用其内部onCreate我不认为这没有错误
public void initializeDateFormat() {
android.text.format.DateFormat df = new android.text.format.DateFormat();
dateFormatPattern = "MMM dd";
if (android.os.Build.VERSION.SDK_INT >= 18){
dateFormatPattern = df.getBestDateTimePattern(Locale.getDefault(), dateFormatPattern);
}
dateFormat = df.getMediumDateFormat(getApplicationContext());
timeFormat = df.getTimeFormat(getApplicationContext());
dateFormat2 = df.getLongDateFormat(getApplicationContext());
}
答案 0 :(得分:1)
好的只是一些事情。取决于您的日期回溯的时间。你只会感兴趣,如果之间的日子超过365.所以,如果你的日期会回溯多年,你就会做额外的工作。
while (sDate.before(eDate) && daysBetween <= 365) {
sDate.add(Calendar.DAY_OF_MONTH, 1);
daysBetween++;
}
会让它破裂,这意味着如果你有20个条目可以追溯到5年,你就不会做太多工作。
可能只需检查毫秒差异即可。我不确定这是否足够精确,但它应该有效。这意味着你不需要循环所有东西E.g
long millisecondsToday = getMilliseconds;
long timeMs = // you already have this
long millisecondsDifference = millisecondsToday - timeMs;
if (millisecondsDifference < MILLISECONDS_TWO_DAYS) // set a final variable out of this method
// etc
如果在方法之外初始化一些变量,也可能值得。就像你的df
一样,正在创建50次,然后只是设置了一些东西。与您的eDate
相同。
答案 1 :(得分:0)
我得到了这个令人难以置信的更快,实际上删除了孔功能 而是像这样
lDateBetween = NOW - timeMS;
if (lDateBetween < DAY)
return FuelTrackerApplication.timeFormat.format(timeMS);
else if (lDateBetween < YEAR)
return df.format(FuelTrackerApplication.dateFormatPattern,timeMS).toString();
else return FuelTrackerApplication.dateFormat.format(timeMS);
所有的计算都是用毫秒进行的,我也把最后的NOW和YEAR,也就是df和lDateBetween 我认为这是我能得到的最快的!