You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 03:04:50