为什么我的代码太慢了?

时间:2013-09-12 05:54:43

标签: android performance

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

2 个答案:

答案 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 我认为这是我能得到的最快的!