java - 使用 Calendar.SATURDAY 作为一周的最后一天时,Holo Calendar 崩溃

标签 java android calendar out-of-memory infinite-loop

我正在使用 Holo Calendar library .

代码量很大,所以我不能把它包含在这个线程中。希望用过它的人会看到它,但该库是免费的,页面底部有一个指向您可以打开的已完成项目的链接。

您可以通过以下方式设置日历的开始和结束日期:

mMultiCalendarView.setFirstDayOfWeek(Calendar.MONDAY);
mMultiCalendarView.setLastDayOfWeek(Calendar.SUNDAY);

但这对我来说是一个看起来很奇怪的日历。一周的第一天是星期一,然后两个周末都是周末。我希望每个星期都在星期天到星期六。

我可以将一周的第一天设置为任何内容,没有问题,但以下行:

mMultiCalendarView.setLastDayOfWeek(Calendar.SATURDAY);

导致应用程序停止运行,无论是一周的第一天。它似乎处于无限循环中,日志猫不断吐出类似以下内容:

02-10 20:29:03.876    2143-2143/(appName) I/dalvikvm-heap﹕ Clamp target GC heap from 96.710MB to 96.000MB
02-10 20:29:03.876    2143-2143/(appName) D/dalvikvm﹕ GC_FOR_ALLOC freed 1272K, 8% free 90712K/98260K, paused 45ms, total 45ms

直到应用程序崩溃并出现以下内存警告:

FATAL EXCEPTION: main
java.lang.OutOfMemoryError

错误指向库中的以下行:

at com.vdesmet.lib.calendar.CalendarView.createHeaders(CalendarView.java:286)
at com.vdesmet.lib.calendar.CalendarView.initView(CalendarView.java:93)
at com.vdesmet.lib.calendar.AbstractCalendarView.onLayout(AbstractCalendarView.java:397)

分别是以下几行:

LINE 286:    headers.addView(header);
LINE  93:    createHeaders();
LINE 397:    initView();

很抱歉,如果没有手头的图书馆,这一切都毫无意义。我已经梳理了每一行代码,以及处理一周中几天的每个循环,但我无法弄清楚这一点。

有没有人处理过这个问题,或者有没有人对导致崩溃的原因有任何想法(基于 this Github page 提供的库)?

最佳答案

从源代码来看,错误似乎是由 do-while 循环的无法到达的结束条件引起的,特别是在 line 288-291 上。在 createHeaders() 中:

private void createHeaders() {

    ...

    final int firstDayOfWeek = mFirstDayOfWeek;
    final int lastDayOfWeek = mLastDayOfWeek;

    ...

    int dayOfWeek = firstDayOfWeek;

    do {

        ...

        // increment dayOfWeek, make sure it's a valid day
        dayOfWeek = dayOfWeek % 7;
        dayOfWeek++;
    } while(dayOfWeek != lastDayOfWeek + 1);

    ...

}

Calendar.SATURDAY的值为 7,而不是开发人员预期的 6。 (准确的说是从Calendar.SUNDAY(1)开始,Calendar.MONDAY(2),...到Calendar.SATURDAY (7)).

另一方面,dayOfWeek % 7 将只返回 0-6,之后加 1,您将得到 1-7。但是循环的结束条件是 dayOfWeek == lastDayOfWeek + 1。当它是 Calendar.SATURDAY 时,它是 (7 + 1) == 8,超出范围。因此,循环不会结束,导致 OutOfMemoryError

解决方案是将结束条件更改为 while(dayOfWeek != (lastDayOfWeek % 7 + 1)); 以确保 lastDayOfWeek 也从 1 换行-7.

附录

需要在 CalendarView.java 中的两行应用更改:

  • 关于 createHeaders()line 291 :

    } while(dayOfWeek != (lastDayOfWeek % 7 + 1));
    
  • 关于 initView()line 119 :

    while((currentDay.get(Calendar.MONTH) + 1) % MONTHS_IN_YEAR == currentMonth ||
            currentDay.get(Calendar.MONTH) == currentMonth ||
            currentDay.get(Calendar.DAY_OF_WEEK) != (lastDayOfWeek % 7 + 1)) {
    

归功于 pandes for follow-up on their GitHub's issue .

关于java - 使用 Calendar.SATURDAY 作为一周的最后一天时,Holo Calendar 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28446172/

相关文章:

Java SimpleDateFormat.format(date) 配置

swift - 如何避免提醒应用程序中的重复条目?

java - 如何处理 Java 可选链中的空值记录

java - 计算 2 小时时间间隔内的平均值的最有效方法是什么

javascript - GWT 无法读取未定义的属性 'example'

java - 元组的动态重定向的Apache Storm问题(对端到端延迟的影响令人困惑)

浏览器中的 Android 模拟器

android - PhoneGap Android 应用程序不显示 pdf 数据

java - 如何使java日历从星期一开始工作日?

android - 在 Toast 中自定义 Android 对讲