有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java MPAndroidChart折线图实时图形删除xvalues不起作用

我的实时图表有一个非常恼人的问题。它在MpAndroidChart库中非常有效,但我想我的内存已经用完了。因为我的实时折线图运行的时间越长,速度就越慢,直到卡住为止。我没有找到任何有效的解决方案

这是我的线条图截图

this are my linecharts 这是我在图表中输入值的代码

( test01 - test04 are possible solution from other posts, I tried )

  private void addEntry(double[][] pts) {
//    System.out.println("#########   addEntry   #########");

if (mLineChartObj != null) {
  int anzLineChartObj = mLineChartObj.size();
//      System.out.println("#########   Anzahl LineChartObj: " + anzLineChartObj);

  for (int i = 0; i < anzLineChartObj; i++) {
    LineChartObject ob = mLineChartObj.get(i);
    LineData data = ob.lineChart.getData();

    if (data != null) {
      data.addXValue((ob.set).getEntryCount() + "");
      data.addEntry(new Entry((float) pts[ob.rootNodePos][0], (ob.set).getEntryCount()), 0);
//          data.addEntry(new Entry((float) (Math.random() * 9) + 0.45f, (ob.set).getEntryCount()), 0);
    }
//    °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
    if (data.getXValCount() > 1400) {

      System.out.println("X-ValueCount: " + ob.lineChart.getXValCount() + "   EntryValueCount: " + ob.set.getEntryCount() + "    ###############################");

//          Test 01 °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
//          for (int j = 0; j < 400; j++) {
//            data.removeXValue(0);
//            ob.set.removeEntry(0);
//          }

//          Test 02 °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
//          runOnUiThread(new Runnable() {
//            @Override
//            public void run() {
//              ob.lineChart.clearValues();
//            }
//          });

//          Test 03 °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
//          for (int j = 400; j > 0; j--) {
//            data.removeXValue(j + 999);
//            ob.set.removeEntry(j + 999);
//          }

//          Test 04 °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
//          data.removeXValue(0);
//          ob.set.removeEntry(0);

      System.out.println("X-ValueCount: " + ob.lineChart.getXValCount() + "   EntryValueCount: " + ob.set.getEntryCount() + "    ###############################");
    }
//    °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
//      notify chart data have changed
    ob.lineChart.notifyDataSetChanged();

//      limit number of visible entries
    float range = 200f;
//        ob.lineChart.setVisibleXRange(0f, range);
    ob.lineChart.setVisibleXRangeMaximum(range);
//      scroll the last entry
    ob.lineChart.moveViewToX(data.getXValCount() - (range + 1f));
  }
}
}

若我从数据中删除x值或从集合中删除条目,会发生一些奇怪的事情。有时应用程序崩溃,或者一行图表开始重复,或者有时每个图表都有多行。我期待着从图表中删除旧值的解决方案

编辑2:%

我的折线图的输出如下图所示。。。它像一个实时图形一样移动,直到xValues的值达到1400,现在我的程序开始删除条目,我的折线图卡住了。过了一会儿,这条线开始从左边消失。在图1中,它被卡住了,在接下来的三张图中,你可以看到它是如何消失的

enter image description here


共 (1) 个答案

  1. # 1 楼答案

    今天我在写一个可视化传感器数据的应用程序时遇到了完全相同的问题。我刚刚想出了以下适合我的临时解决方案:

        // (following code snippet is from an event listener)
    
        final ArrayList<Float> values = event.getValues();
        final LineData data = mChart.getData();
        // add data entry
        if (mIndex < MAX_PLOT_SIZE) {
            maxValue = 0f;
            data.addXValue("" + mIndex);
            for (int i = 0; i < values.size(); i++) {
                final Float val = values.get(i);
                final LineDataSet set = data.getDataSetByIndex(i);
                set.addEntry(new Entry(val, mIndex));
            }
            mIndex++;
        } else {
            // shift values down
            for (int i = 0; i < values.size(); i++) {
                final LineDataSet set = data.getDataSetByIndex(i);
                final List<Entry> yVals = set.getYVals();
                final int size = yVals.size();
                for (int j = 0; j < size - 1; j++) {
                    yVals.get(j).setVal(yVals.get(j + 1).getVal());
                }
                // add new value
                final Float val = values.get(i);
                yVals.get(size - 1).setVal(val);
            }      
        }
    

    诚然,这是一个黑客行为,应该有一个更简单的方法来做,但至少它完成了任务。我想您可以尝试以相同的方式调整xVal字符串