syedowaisali / crystal-range-seekbar

538 stars 170 forks source link

StackOverflow error #85

Closed Edwhis closed 6 years ago

Edwhis commented 6 years ago

Hello, I don't know why, but a lot of my app users are getting this error from your library:

Fatal Exception: java.lang.StackOverflowError: stack size 8MB at android.view.View.invalidate(View.java:13892) at android.view.View.invalidate(View.java:13876) at com.crystal.crystalrangeseekbar.widgets.CrystalRangeSeekbar.setNormalizedMinValue(CrystalRangeSeekbar.java:789) at com.crystal.crystalrangeseekbar.widgets.CrystalRangeSeekbar.setMinStartValue(CrystalRangeSeekbar.java:711) at com.crystal.crystalrangeseekbar.widgets.CrystalRangeSeekbar.apply(CrystalRangeSeekbar.java:438) at com.app.widget.chart.ChartRange$1.valueChanged(ChartRange.java:87) at com.crystal.crystalrangeseekbar.widgets.CrystalRangeSeekbar.apply(CrystalRangeSeekbar.java:456) at com.app.widget.chart.ChartRange$1.valueChanged(ChartRange.java:87) at com.crystal.crystalrangeseekbar.widgets.CrystalRangeSeekbar.apply(CrystalRangeSeekbar.java:456) at com.app.widget.chart.ChartRange$1.valueChanged(ChartRange.java:87) at com.crystal.crystalrangeseekbar.widgets.CrystalRangeSeekbar.apply(CrystalRangeSeekbar.java:456) at com.app.widget.chart.ChartRange$1.valueChanged(ChartRange.java:87) at com.crystal.crystalrangeseekbar.widgets.CrystalRangeSeekbar.apply(CrystalRangeSeekbar.java:456) at com.app.widget.chart.ChartRange$1.valueChanged(ChartRange.java:87) at com.crystal.crystalrangeseekbar.widgets.CrystalRangeSeekbar.apply(CrystalRangeSeekbar.java:456) at com.app.widget.chart.ChartRange$1.valueChanged(ChartRange.java:87) at com.crystal.crystalrangeseekbar.widgets.CrystalRangeSeekbar.apply(CrystalRangeSeekbar.java:456) at com.app.widget.chart.ChartRange$1.valueChanged(ChartRange.java:87) at com.crystal.crystalrangeseekbar.widgets.CrystalRangeSeekbar.apply(CrystalRangeSeekbar.java:456) at com.app.widget.chart.ChartRange$1.valueChanged(ChartRange.java:87) at com.crystal.crystalrangeseekbar.widgets.CrystalRangeSeekbar.apply(CrystalRangeSeekbar.java:456) at com.app.widget.chart.ChartRange$1.valueChanged(ChartRange.java:87) at com.crystal.crystalrangeseekbar.widgets.CrystalRangeSeekbar.apply(CrystalRangeSeekbar.java:456) at com.app.widget.chart.ChartRange$1.valueChanged(ChartRange.java:87) at com.crystal.crystalrangeseekbar.widgets.CrystalRangeSeekbar.apply(CrystalRangeSeekbar.java:456) at com.app.widget.chart.ChartRange.update(ChartRange.java:166) at com.app.widget.chart.Chart.updateSeekbar(Chart.java:321) at com.app.widget.chart.Chart.initSeekbar(Chart.java:314) at com.app.activity.ChangeStatusActivity.setUiMode(ChangeStatusActivity.java:314) at com.app.activity.ChangeStatusActivity.onOptionsItemSelected(ChangeStatusActivity.java:226) at android.app.Activity.onMenuItemSelected(Activity.java:3205) at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:368) at android.support.v7.app.AppCompatActivity.onMenuItemSelected(AppCompatActivity.java:195) at android.support.v7.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:108) at android.support.v7.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:108) at android.support.v7.app.ToolbarActionBar$2.onMenuItemClick(ToolbarActionBar.java:65) at android.support.v7.widget.Toolbar$1.onMenuItemClick(Toolbar.java:202) at android.support.v7.widget.ActionMenuView$MenuBuilderCallback.onMenuItemSelected(ActionMenuView.java:780) at android.support.v7.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:822) at android.support.v7.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:171) at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:973) at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:963) at android.support.v7.widget.ActionMenuView.invokeItem(ActionMenuView.java:624) at android.support.v7.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:150) at android.view.View.performClick(View.java:5698) at android.widget.TextView.performClick(TextView.java:10891) at android.view.View$PerformClick.run(View.java:22538) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:158) at android.app.ActivityThread.main(ActivityThread.java:7230) at java.lang.reflect.Method.invoke(Method.java) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

I didn't find how to reproduce it. I am using newest lib version (1.1.3). Crashes comes from various devices and various os versions. Any suggestions?

syedowaisali commented 6 years ago

Show me your code

Edwhis commented 6 years ago
crystalRangeSeekbar.setOnRangeSeekbarChangeListener(new OnRangeSeekbarChangeListener() {
            @Override
            public void valueChanged(Number minValue, Number maxValue) {
                if (limit < maxValue.longValue()) {
                    maxValue = limit;

                    crystalRangeSeekbar
                            .setMinStartValue(minValue.floatValue())
                            .setMaxStartValue(limit)
                            .apply();
                }

                onValueChanged(minValue, maxValue);
            }
        });

Error comes from here. In my app in some cases I need to set range seek limit to prevent users to select bigger values. If seekbar value is more than limit, I am updating seekbar view setting seek to limit value.

syedowaisali commented 6 years ago

you are creating a cycle of "invalidate" method using.

if (limit < maxValue.longValue()) {
    maxValue = limit;

    crystalRangeSeekbar
        .setMinStartValue(minValue.floatValue())
        .setMaxStartValue(limit)
        .apply();
}

remove this from listener and set the min and max value on setup seekbar. for example:

crystalRangeSeekbar
        .setMinStartValue(0)
        .setMaxStartValue(100)
        .setMinValue(0)
        .setMaxValue(100)
        .apply();