Android GraphView重置数据失败,抛出x值必须递增异常
解决GraphView重置数据后抛出x值异常的问题
嘿,我帮你排查一下这个问题,看起来你遇到的IllegalArgumentException是GraphView中appendData方法的典型报错,根源是新添加的x值没有严格大于当前series的最后一个x值,结合你的代码来看,主要有几个需要调整的地方:
1. 先修复series的初始化问题
看你的onCreate代码,存在重复创建和添加series的问题:
// 这里注释掉了series的初始化,后面又重新创建了一个局部series // data series = new LineGraphSeries<DataPoint>(); graph.addSeries(series); // ... 中间配置viewport ... final LineGraphSeries<DataPoint> series = new LineGraphSeries<>(new DataPoint[] { new DataPoint(0, 0) }); graph.addSeries(series);
这会导致GraphView中被添加了两个series,而你后续操作的series可能不是当前显示的那个,重置和添加数据的操作会混乱。
修正后的初始化代码:
// 在类中定义成员变量 private LineGraphSeries<DataPoint> series; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.your_activity_layout); GraphView graph = (GraphView) findViewById(R.id.graph); // 只初始化一次series并添加到GraphView series = new LineGraphSeries<>(new DataPoint[] { new DataPoint(0, 0) }); graph.addSeries(series); series.setThickness(2); // 配置视口 Viewport viewport = graph.getViewport(); viewport.setYAxisBoundsManual(true); viewport.setXAxisBoundsManual(true); viewport.setMinY(0); viewport.setMaxY(25000); viewport.setMinX(0); viewport.setMaxX(5000); viewport.setScrollable(true); }
2. 重置数据时同步重置x值计数器
你当前的addEntry方法依赖传入的a参数作为x值,如果你在重置数据后,没有把生成a的计数器重置,就可能出现:重置后series的最后一个x值是0,但下一个添加的a是之前的累计值(比如1000)——这不会报错,但如果重置后你又传入了a=0,就会触发异常。
解决方法:
假设你有一个用来记录当前x值的计数器(比如int currentX = 0;),在重置数据时同步重置它:
// 类成员变量 private int currentX = 0; // 重置按钮点击事件 buttonUpdate.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // 重置为初始点 series.resetData(new DataPoint[] {new DataPoint(0, 0)}); // 同步重置计数器,下一个x从1开始 currentX = 1; } }); // 修改addEntry方法,使用计数器生成x值 private void addEntry(int b) { series.appendData(new DataPoint(currentX, b), true, 50000); currentX++; // 每次添加后自增 }
3. 更稳妥的x值生成方式(避免依赖计数器)
如果你不想手动管理计数器,可以每次添加数据时自动获取当前series的最后一个x值,然后生成下一个x值,这样无论有没有重置,都不会出错:
private void addEntry(int b) { double lastX = 0; // 获取当前series最后一个数据点的x值 if (series.getDataPoints().length > 0) { lastX = series.getLastDataPoint().getX(); } // 新x值为最后一个x值+1,确保严格递增 series.appendData(new DataPoint(lastX + 1, b), true, 50000); }
4. 确保所有操作在主线程执行
如果你的addEntry方法是在子线程中调用的(比如声级测量的回调线程),一定要切换到主线程操作series,因为GraphView的UI操作必须在主线程:
private void addEntry(int b) { runOnUiThread(() -> { double lastX = 0; if (series.getDataPoints().length > 0) { lastX = series.getLastDataPoint().getX(); } series.appendData(new DataPoint(lastX + 1, b), true, 50000); }); }
按照上面的步骤调整后,多次点击重置按钮或者添加数据都不会再抛出那个x值异常了。
内容的提问来源于stack exchange,提问作者RubenDefour
相关产品推荐
相关产品推荐

