PhilJay / MPAndroidChart

A powerful 🚀 Android chart view / graph view library, supporting line- bar- pie- radar- bubble- and candlestick charts as well as scaling, panning and animations.
Other
37.53k stars 9.01k forks source link

ANR:AxisRenderer.java:212 #4725

Open liliang4869 opened 4 years ago

liliang4869 commented 4 years ago

got ANR using linechart

version: v3.1.0-alpha trace: 1 com.github.mikephil.charting.renderer.AxisRenderer.computeAxisValues(AxisRenderer.java:212) 2 com.github.mikephil.charting.renderer.XAxisRenderer.computeAxisValues(XAxisRenderer.java:72) 3 com.github.mikephil.charting.renderer.XAxisRenderer.computeAxis(XAxisRenderer.java:67) 4 com.github.mikephil.charting.charts.BarLineChartBase.onDraw(BarLineChartBase.java:209) 5 android.view.View.draw(View.java:16195) 6 android.view.View.draw(View.java:16107) 7 android.view.ViewGroup.drawChild(ViewGroup.java:3610) 8 android.view.ViewGroup.dispatchDraw(ViewGroup.java:3400) 9 android.view.View.draw(View.java:16105) 10 android.view.ViewGroup.drawChild(ViewGroup.java:3610) 11 android.view.ViewGroup.dispatchDraw(ViewGroup.java:3400) 12 android.view.View.draw(View.java:16105) 13 android.view.ViewGroup.drawChild(ViewGroup.java:3610) 14 android.view.ViewGroup.dispatchDraw(ViewGroup.java:3400) 15 android.view.View.draw(View.java:16198) 16 android.view.View.draw(View.java:16107) 17 android.view.ViewGroup.drawChild(ViewGroup.java:3610) 18 android.view.ViewGroup.dispatchDraw(ViewGroup.java:3400) 19 android.view.View.draw(View.java:16105) 20 android.view.ViewGroup.drawChild(ViewGroup.java:3610) 21 android.view.ViewGroup.dispatchDraw(ViewGroup.java:3400) 22 android.view.View.draw(View.java:16105) 23 android.view.ViewGroup.drawChild(ViewGroup.java:3610) 24 android.view.ViewGroup.dispatchDraw(ViewGroup.java:3400) 25 android.view.View.draw(View.java:16105) 26 android.view.ViewGroup.drawChild(ViewGroup.java:3610) 27 android.view.ViewGroup.dispatchDraw(ViewGroup.java:3400) 28 android.view.View.draw(View.java:16105) 29 android.view.ViewGroup.drawChild(ViewGroup.java:3610) 30 android.view.ViewGroup.dispatchDraw(ViewGroup.java:3400) 31 android.view.View.draw(View.java:16198) 32 com.android.internal.policy.PhoneWindow$DecorView.draw(PhoneWindow.java:2734) 33 android.view.ViewRootImpl.drawSoftware(ViewRootImpl.java:2728) 34 android.view.ViewRootImpl.draw(ViewRootImpl.java:2642) 35 android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2434) 36 android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2067) 37 android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107) 38 android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6013) 39 android.view.Choreographer$CallbackRecord.run(Choreographer.java:858) 40 android.view.Choreographer.doCallbacks(Choreographer.java:670) 41 android.view.Choreographer.doFrame(Choreographer.java:606) 42 android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844) 43 android.os.Handler.handleCallback(Handler.java:739) 44 android.os.Handler.dispatchMessage(Handler.java:95) 45 android.os.Looper.loop(Looper.java:148) 46 android.app.ActivityThread.main(ActivityThread.java:5417) 47 java.lang.reflect.Method.invoke(Native Method) 48 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 49 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

code:

private void configChart() {
    YAxis ly = chart.getAxisLeft();
    ly.setAxisMinimum(60);
    ly.setAxisMaximum(200);
    ly.setLabelCount(8, true);
    ly.setDrawGridLines(false);
    ly.setTextColor(0xffefefef);
    YAxis ry = chart.getAxisRight();
    ry.setAxisMaximum(200);
    ry.setAxisMinimum(60);
    ry.setLabelCount(8, true);
    ry.setDrawGridLines(false);
    ry.setTextColor(0xffefefef);
    chart.setScaleXEnabled(true);
    chart.setScaleYEnabled(false);
    chart.setDragEnabled(false);
    chart.setTouchEnabled(true);
    data = new LineData();
    data.setValueTextColor(Color.WHITE);
    chart.getDescription().setEnabled(false);
    chart.setData(data);
    chart.getLegend().setEnabled(false);
    chart.getXAxis().setPosition(XAxis.XAxisPosition.BOTTOM);
    chart.setHighlightPerTapEnabled(true);
    XAxis xAxis = chart.getXAxis();
    xAxis.setValueFormatter(new MyXAxisValueFormatter(dataList));//dataList:object list
    xAxis.setGranularity(1);
    xAxis.setAxisMinimum(1);
    chart.setDrawGridBackground(true);
    xAxis.setDrawAxisLine(true);
    xAxis.setDrawGridLines(false);
    xAxis.setTextColor(0xffefefef);
    initEntry();
}

private void initEntry() {
    LineData data = chart.getData();
    data.addDataSet(createSet());
    data.notifyDataChanged();
    chart.notifyDataSetChanged();
    chart.moveViewToX(data.getEntryCount());
}

private LineDataSet createSet() {
    ArrayList<Entry> values = new ArrayList<>();
    for (int i = 0; i < heartRateList.size(); i++) {
        int h = dataList.get(i).getValue();//get value from  object
        h = h > 200 ? 200 : h < 60 ? 60 : h;
        values.add(new Entry(i, h));
    }
    LineDataSet set = new LineDataSet(values, "y-value");
    set.setColor(Color.rgb(0xe6, 0x12, 0x10));
    set.setAxisDependency(YAxis.AxisDependency.LEFT);
    set.setLineWidth(1.5f);
    set.setDrawValues(false);
    set.setDrawCircles(false);
    set.setMode(LineDataSet.Mode.LINEAR);
    set.setDrawFilled(false);
    return set;
}

public class MyXAxisValueFormatter implements IAxisValueFormatter {
    private List<MyData> mValues;
    public MyXAxisValueFormatter(List<MyData> mValues) {
        this.mValues = mValues;
    }

    @Override
    public String getFormattedValue(float value, AxisBase axis) {
        if (value < 0) {
            return "";
        }
        int position = (int) value;
        if (position >= mValues.size()) return "";
        String result = ""+mValues.get(position).getLabel();//get label from object
        return result;
    }
}
juziw0 commented 2 years ago

解决了嘛