MPAndroidChart CombinedChart随机崩溃排查求助(BarChartRenderer相关)
解决MPAndroidChart CombinedChart中BarChartRenderer崩溃的问题
我之前也踩过CombinedChart里BarChartRenderer空指针的坑,结合你提到的mBarBuffers初始化问题,给你梳理下可能的原因和可行的解决办法:
问题根源
你提到mBarBuffers是在initBuffers()里通过BarData的数据集数量初始化的,但如果你的逻辑是仅当有数据时才创建BarData并加入CombinedData,那当数据为空时,mChart.getBarData()会返回null,这时候直接调用barData.getDataSetCount()就会触发空指针崩溃;就算BarData存在但数据集数量为0,也可能导致后续绘制逻辑出问题。
具体修复方案
1. 始终保证BarData存在(哪怕是空的)
不要在无数据时就把BarData从CombinedData中移除,而是给它一个空的BarData对象兜底:
CombinedData combinedData = new CombinedData(); // 无论有没有可绘制数据,都初始化BarData BarData barData; if (!data.isEmpty()) { // 有数据时创建正常的BarData barData = createBarDataWithData(data); } else { // 无数据时创建空的BarData barData = new BarData(); } combinedData.setData(barData); // 继续添加LineData等其他组合数据 combinedData.setData(yourLineData); mChart.setData(combinedData);
2. 给BarChartRenderer的initBuffers()加防护逻辑
如果你自定义了BarChartRenderer,一定要在初始化mBarBuffers前对BarData做判空处理,避免空指针:
@Override public void initBuffers() { BarData barData = mChart.getBarData(); // 先判断BarData是否为空,为空则初始化空的Buffer数组 if (barData == null) { mBarBuffers = new BarBuffer[0]; return; } // 正常初始化Buffer数组 mBarBuffers = new BarBuffer[barData.getDataSetCount()]; // 后续的Buffer初始化逻辑... }
3. 更新数据时的正确姿势
不要直接在无数据时跳过BarData的设置,而是更新现有BarData的内容:
// 获取当前CombinedData中的BarData,没有则创建空的 BarData barData = mChart.getCombinedData().getBarData(); if (barData == null) { barData = new BarData(); } if (!data.isEmpty()) { // 有数据时替换BarData的内容 barData = createBarDataWithData(data); } else { // 无数据时清空BarData的所有内容 barData.clearValues(); barData.removeAllDataSets(); } mChart.getCombinedData().setData(barData); mChart.notifyDataSetChanged();
排查小技巧
崩溃时优先看堆栈信息,如果报错位置在BarChartRenderer.initBuffers()方法内,那90%的概率是BarData为null或者数据集数量异常,这时候去检查你设置CombinedData的逻辑,是不是在无数据场景下漏掉了BarData的初始化。
内容的提问来源于stack exchange,提问作者Ariles
相关产品推荐
相关产品推荐

