Android graphview和数据绘图计时问题?

时间:2017-08-25 20:47:07

标签: java android android-asynctask android-graphview

我目前正在尝试修复"用于通过BLE控制设备的Android应用程序。该应用程序完全由其他人编写,我目前对Java知之甚少。因此,如果有明显的缺陷,请指出它们,我会解决它们。我无法给出你在这里看到的一切理由,但我会尽我所能。虽然有许多问题和需要解决的问题,但我目前的问题是数据绘图仪。实现GraphView以创建绘图。问题是绘制的数据不代表实际采样率。使用单独的BLE数据记录器时,我可以验证数据是否以正确的速率发送,并使用excel正确绘制。

这些是在启动时创建的。

graph1 = (GraphView) findViewById(R.id.graph1);
airPressureSeries = new LineGraphSeries<>();
fluidPressureSeries = new LineGraphSeries<>();
airPressureSeries.setDrawAsPath(true);
fluidPressureSeries.setDrawAsPath(true);
graph1.getViewport().setXAxisBoundsManual(true);
graph1.getViewport().setMinX(0);
graph1Num = 100;
graph1.getViewport().setMaxX(graph1Num);

graph2 = (GraphView) findViewById(R.id.graph2);
airTemperatureSeries = new LineGraphSeries<>();
fluidTemperatureSeries = new LineGraphSeries<>();
airTemperatureSeries.setDrawDataPoints(true);
fluidTemperatureSeries.setDrawDataPoints(true);
graph2.getViewport().setXAxisBoundsManual(true);
graph2.getViewport().setMinX(0);
graph2Num = graph1Num;
graph2.getViewport().setMaxX(graph2Num);

然后在显示数据绘图时完成。

plot1Dropdown.setText("Air Pressure");
graph1.addSeries(airPressureSeries);
plot1Title.setText(R.string.pressureTitle);
plot2Dropdown.setText("Fluid Pressure");
plot2Title.setText(R.string.pressureTitle);
graph2.addSeries(fluidPressureSeries);

这个计时器,我不太了解,可能是错的,已经开始了。他们说应该以100Hz运行。其中的代码应该只是增加绘图的x值,然后获取一个在其他地方更新的全局变量。

mTimer1 = new Runnable() {
        @Override
        public void run() {

            graph1LastXValue += 1d;
            airPressureSeries.appendData(new DataPoint(graph1LastXValue, 
               airPressureValue), true, graph1Num);
            fluidPressureSeries.appendData(new DataPoint(graph1LastXValue, 
               fluidPressureValue), true, graph1Num);
            graph2LastXValue += 1d;
            airTemperatureSeries.appendData(new DataPoint(graph2LastXValue, 
               airTemperatureValue), true, graph2Num);
            fluidTemperatureSeries.appendData(new DataPoint(graph2LastXValue
               , fluidTemperatureValue), true, graph2Num);
            mHandler.postDelayed(this, 5);
        }
    };
    mHandler.postDelayed(mTimer1, 5);

全局变量在AsyncTask接收和解析新数据后更新。在AsyncTask的doInBackground中,它将解析后的值分配给这样的全局变量。

DeviceControlActivity.airPressureValue = airPressure;
DeviceControlActivity.airTemperatureValue = airTemperature;
DeviceControlActivity.fluidPressureValue = fluidPressure;
DeviceControlActivity.fluidTemperatureValue = fluidTemperature;

我做了一些事情来检查发生了什么。我确信定时器运行速度足以更新值。我也确信正在以正确的速率收到数据。我使用日志来确保这一点。我也确信在合理的时间内运行和完成异步任务。在post执行它时,我告诉它记录执行前和执行后函数调用之间传递的时间。它一直是1毫秒,这对应用程序来说很好。

我认为问题与如何设置或检索值有关。根据计时器内部代码的工作方式,即使数据尚未更新,也会绘制一个新点,因此我得到的图区域在相当大的时间内都是相同的值。

有人能指出我正确的方向吗?

0 个答案:

没有答案
相关问题