0

在使用传递给适配器的查询加载光标后,我在 android 上运行此代码,但我的日期以毫秒为单位,因此我需要在加载适配器之前正确格式化!问题是这段代码需要 14 秒才能通过 50 项加载,如果我在适配器 getView 中调用它,问题会变得更糟

这是我的列表片段中的调用

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

2 回答 2

1

好的,只有几件事。取决于您的日期要追溯到多久以前。只有当间隔超过 365 天时,您才会感兴趣。因此,如果您的日期要追溯到多年前,那么您就是在做额外的工作。

while (sDate.before(eDate) && daysBetween <= 365) {
    sDate.add(Calendar.DAY_OF_MONTH, 1);
    daysBetween++;
}

让它崩溃,这意味着如果你有 20 个条目可以追溯到 5 年,那么你不会做太多的工作。

可能只检查毫秒差异可能是值得的。我不确定这是否足够精确,但它应该可以工作。这意味着您不需要循环所有内容,例如

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

于 2013-09-12T06:21:57.807 回答
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);

所有的计算都是用毫秒计算的

于 2013-09-12T21:54:57.430 回答