使用Android日历的setMinDate()时出现StackOverflowError

2019年7月5日 28点热度 0条评论

请参考上图所示的错误。

当我设置calendarView.setMinDate时会显示此问题
当我使用压光机时,我无法解决这个问题

后台并发复制GC释放了98234(2MB)AllocSpace对象,
1个(1564KB)LOS对象,41%可用,34MB / 58MB,暂停总139us
366.099毫秒

这是我的代码

 public class select_time extends BaseActivity {

    @BindView(R.id.calendarView)
    CalendarView calendarView;
    DatesView datesView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.select_time);
        ButterKnife.bind(this);
        in = getIntent().getBooleanExtra("in", true);
        datesView = new DatesView(findViewById(R.id.datesView));
        datesView.setOnCalenderClick(new DatesView.onClenderClick() {
            @Override
            public void OnClick(boolean in) {
                setWanted(in);
            }
        });
        datesView.refresh(this);
        refreshCalendar();
        calendarView.setOnDateChangeListener(new CalendarView.OnDateChangeListener() {
            @Override
            public void onSelectedDayChange(CalendarView view, int year, int month, int day) {
                Calendar calendar = Calendar.getInstance();
                calendar.set(year, month, day, 0, 0, 0);
                SharedPreferences prefs = getSharedPreferences("data", 0);
                prefs.edit().putLong((in ? "in" : "out") + "_date", calendar.getTimeInMillis()).apply();
                if (in) {
                    if (calendar.getTimeInMillis() == out_date.getTime() || calendar.getTimeInMillis() >= out_date.getTime()) {
                        calendar.add(Calendar.DATE, 1);
                        prefs.edit().putLong("out_date", calendar.getTimeInMillis()).apply();
                    }
                } else {
                    if (calendar.getTimeInMillis() == out_date.getTime() || calendar.getTimeInMillis() <= out_date.getTime()) {
                        calendar.add(Calendar.DATE, -1);
                        prefs.edit().putLong("in_date", calendar.getTimeInMillis()).apply();
                    }
                }
                datesView.refresh(select_time.this);
            }
        });
    }
    Date in_date,out_date;
    public void refreshCalendar(){
        SharedPreferences prefs = getSharedPreferences("data", 0);
        in_date = new Date(prefs.getLong("in_date", 0));
        out_date = new Date(prefs.getLong("out_date", 0));
        calendarView.setMinDate(System.currentTimeMillis() - 1000);
        calendarView.setDate(in ? in_date.getTime() : out_date.getTime());
        setWanted(in);

    }
    boolean in;
    public void setWanted(boolean in) {
        this.in = in;
        datesView.check_in.setBackgroundColor(getResources().getColor(in ? R.color.gray : R.color.white));
        datesView.check_out.setBackgroundColor(getResources().getColor(!in ? R.color.gray : R.color.white));
        refreshCalendar();
    }
    public void clickDone(View view) {
        finish();
    }
}

有人可以帮我使用日历吗?

解决方案如下:

您正在从setWanted(in);呼叫refreshCalendar(),也正在从refreshCalendar();呼叫setWanted(boolean in)。这将创建一个无限调用循环,最终耗尽堆栈。您需要删除这两个呼叫之一。