Android中HighCharts多系列折线图在网络请求内配置后不显示,日志提示Uncaught ReferenceError: Highcharts is not defined
Android中HighCharts多系列折线图在网络请求内配置后不显示,日志提示Uncaught ReferenceError: Highcharts is not defined
看起来你遇到的问题挺典型的:静态数据放在网络请求外能正常显示折线图,但在请求回调里配置数据后,图表就消失了,还报Uncaught ReferenceError: Highcharts is not defined的错误,而且日志里拿到的数据是完全正确的。咱们一步步来排查解决:
一、先搞定Highcharts未定义的核心错误
这个错误本质是HIChartView的JS环境还没初始化完成,你就急着给它设置带数据的options了。静态数据能工作是因为你在页面初始化的早期就设置了,JS环境刚好赶得上;但网络请求是异步的,回调触发时可能JS环境还没准备好。
解决思路是:把基础的图表配置(比如类型、标题)提前初始化,先设置给图表让它完成JS环境加载,再在回调里只更新数据部分:
// 页面初始化时就获取图表实例 HIChartView monprchart = findViewById(R.id.monprchart); HIOptions options = new HIOptions(); // 提前初始化基础配置,这部分不要放在网络请求里 HIChart chart = new HIChart(); chart.setType("line"); options.setChart(chart); HITitle title = new HITitle(); title.setText("Volume (MW)"); HICSSObject style = new HICSSObject(); style.setFontSize("15px"); title.setStyle(style); options.setTitle(title); // 先把基础配置设置给图表,触发JS环境初始化 monprchart.setOptions(options); // 再发起网络请求 StringRequest stringRequest = new StringRequest(Request.Method.POST, URL_MONPRCHART, new Response.Listener<String>() { @Override public void onResponse(String response) { try { JSONObject jsonObject = new JSONObject(response); String success = jsonObject.getString("status"); JSONArray jsonArray1 = jsonObject.getJSONArray("price_mmr"); if (success.equals("true")) { List<String> block_time = new ArrayList<>(); List<Number> avg_iex_price = new ArrayList<>(); List<Number> avg_pxil_price = new ArrayList<>(); for (int i = 0; i < jsonArray1.length(); i++) { JSONObject object1 = jsonArray1.getJSONObject(i); block_time.add(object1.getString("block_time")); avg_iex_price.add(parseNumber(object1.optString("avg_iex_price", "0"))); avg_pxil_price.add(parseNumber(object1.optString("avg_pxil_price", "0"))); } // 回调里只更新X轴、Y轴和数据系列 HIXAxis xAxis = new HIXAxis(); xAxis.setCategories(block_time); options.setXAxis(Collections.singletonList(xAxis)); HIYAxis yAxis = new HIYAxis(); HITitle yTitle = new HITitle(); yTitle.setText(""); yAxis.setTitle(yTitle); options.setYAxis(Collections.singletonList(yAxis)); // 构建折线系列 List<HISeries> seriesList = new ArrayList<>(); HILine series1 = new HILine(); series1.setName("Avg. IEX"); series1.setData(avg_iex_price); series1.setColor(HIColor.initWithHexValue("007bff")); seriesList.add(series1); HILine series2 = new HILine(); series2.setName("Avg. PXIL"); series2.setData(avg_pxil_price); series2.setColor(HIColor.initWithHexValue("28a745")); seriesList.add(series2); options.setSeries(seriesList); // 最后更新配置并重载图表 monprchart.setOptions(options); monprchart.reload(); } } catch (Exception e) { e.printStackTrace(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { error.printStackTrace(); } }); // 别忘了把请求加入Volley队列 RequestQueue queue = Volley.newRequestQueue(this); queue.add(stringRequest);
二、检查你的parseNumber方法
你用到了自定义的parseNumber方法,一定要确保它能正确把字符串转换成Number类型(比如Double),如果转换失败返回0,避免数据系列出现异常:
private Number parseNumber(String value) { try { return Double.parseDouble(value.trim()); } catch (NumberFormatException e) { Log.w("ParseError", "Failed to parse value: " + value); return 0; } }
三、确保图表的生命周期正确
如果是在Fragment里使用,要在onViewCreated方法里获取HIChartView实例,不要在onCreate里提前获取;Activity里则在onCreate的setContentView之后获取,保证视图已经加载完成。
四、强制等待JS环境加载完成
如果上面的方法还没解决,可以给HIChartView加一个加载监听,等JS环境完全准备好再处理数据:
monprchart.setOnHIChartViewListener(new HIChartView.HIChartViewListener() { @Override public void onHIChartViewLoaded() { // 这里JS环境已经初始化完毕,再发起网络请求 RequestQueue queue = Volley.newRequestQueue(MainActivity.this); queue.add(stringRequest); } @Override public void onHIChartViewError(String error) { Log.e("ChartInitError", error); } });
核心逻辑就是:让HIChartView先完成JS环境的初始化,再给它喂数据,而不是反过来。这样应该就能解决图表不显示和Highcharts未定义的问题了。
内容来源于stack exchange
相关产品推荐
相关产品推荐

