Java 使用Calendar.SATURDAY作为一周的最后一天时,Holo Calendar崩溃
我正在使用 这是一个大量的代码,所以我不能把它包含在这个线程中。希望有人会看到这个谁使用过它,但图书馆是免费的,有一个链接在页面底部的一个完整的项目,你可以打开 您可以通过以下方式设置日历的开始和结束日期:Java 使用Calendar.SATURDAY作为一周的最后一天时,Holo Calendar崩溃,java,android,calendar,out-of-memory,infinite-loop,Java,Android,Calendar,Out Of Memory,Infinite Loop,我正在使用 这是一个大量的代码,所以我不能把它包含在这个线程中。希望有人会看到这个谁使用过它,但图书馆是免费的,有一个链接在页面底部的一个完整的项目,你可以打开 您可以通过以下方式设置日历的开始和结束日期: mMultiCalendarView.setFirstDayOfWeek(Calendar.MONDAY); mMultiCalendarView.setLastDayOfWeek(Calendar.SUNDAY); 但对我来说,这是一个奇怪的日历。一周的第一天是星期一,然后两个周末都在周
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();
我很抱歉,如果手头没有图书馆,这一切都毫无意义。我已经梳理了每一行代码,以及一周中处理循环的每一天,但我无法找出这一行
是否有人对此进行过处理,或者是否有人对导致崩溃的原因有任何想法(基于上提供的库)?从源代码看,错误似乎是由
do while
循环的无法访问的结束条件引起的,尤其是在createHeaders()内部:
的值是7,而不是开发人员期望的6。(确切地说,它从日历.星期天开始日历.星期一开始日历.星期一开始日历.星期六开始日历.星期六开始.(7))
另一方面,dayOfWeek%7
将只返回0-6,然后添加1,您将得到1-7。但是循环的结束条件是dayOfWeek==lastDayOfWeek+1
。当它是日历。星期六时,它是(7+1)=8,超出范围。因此,循环不会结束,导致OutOfMemoryError
解决方案是将结束条件更改为while(dayOfWeek!=(lastDayOfWeek%7+1))
以确保lastDayOfWeek
也从1-7换行
附录
更改需要应用于CalendarView.java中的两行:
- 在
createHeaders()
,:
- 在
initView()
,:
归功于。谢谢您的回答!我不久前就想出来了,但忘了我贴了这个问题。是的,这都与条件中的mod运算符有关。还没有测试过这个问题,但会选择它作为答案,除非证明它是错的(但听起来都是对的!)。
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);
...
}
} while(dayOfWeek != (lastDayOfWeek % 7 + 1));
while((currentDay.get(Calendar.MONTH) + 1) % MONTHS_IN_YEAR == currentMonth ||
currentDay.get(Calendar.MONTH) == currentMonth ||
currentDay.get(Calendar.DAY_OF_WEEK) != (lastDayOfWeek % 7 + 1)) {