Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Calendar.SATURDAY作为一周的最后一天时,Holo Calendar崩溃_Java_Android_Calendar_Out Of Memory_Infinite Loop - Fatal编程技术网

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)) {