我正在使用 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
中的两行应用更改:
关于java - 使用 Calendar.SATURDAY 作为一周的最后一天时,Holo Calendar 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28446172/