我最初的问题是:Android GraphView project get freeze with real time updates。在这篇文章中,我询问了 3 个绘图的 UI 线程中可能存在的并发性。在内存分配图中,它看起来像这样:
我直接从我ProcessThread
的主要活动中接收数据,并使用onEventMainThread
从EventBus
库将其传递回GraphFragment
. 传递的所有数据都ProcessThread
来自蓝牙监听服务收集数据,然后继续获取有意义的数字。
我的想法是测试仅生成数据并将其发送到onEventMainThread
. 因为这也会产生一些错误,所以我不得不问另一个问题:Difficulty in understand complex multi threading in Android app。一段时间后,我从@AsifMujteba 收到了很好的回答,解释说我的测试线程太快了。
知道我能够回到我的主要问题和我的真实线程来检查所有时间是否正确。正如我所说,有很多事情发生,所以快速不是问题(但是,我添加了同样的机制来测试数据是否没有快速发送)。我会更担心减慢这个线程的工作。
我现在的onEventMainThread
样子是这样的:
public void onEventMainThread(float[] data) {
mSeries1.appendData(new DataPoint(counter,data[0]),true,100);
mSeries1.appendData(new DataPoint(counter,data[1]),true,100);
mSeries1.appendData(new DataPoint(counter,data[2]),true,100);
counter++;
}
不幸的是,当我回到开头时,问题又出现了。经过大量测试后,我可以说数据看起来正在正确发送。我用两个标记检查了它:
public void onEventMainThread(float[] data) {
Log.d("LOG","marker1");
mSeries1.appendData(new DataPoint(counter,data[0]),true,100);
mSeries1.appendData(new DataPoint(counter,data[1]),true,100);
mSeries1.appendData(new DataPoint(counter,data[2]),true,100);
counter++;
Log.d("LOG","marker2");
}
Logcat 消息显示正确。不幸的是,即使发送看起来与我的测试线程中的相同,也会出现错误:
if((System.currentTimeMillis()-start)>10) {
values[0] = (float) getRandom();
values[1] = (float) getRandom();
values[2] = (float) getRandom();
EventBus.getDefault().post(values);
start = System.currentTimeMillis();
}
更重要的是,我确信数据始终正确发送,因为当我使用 OpenGL 可视化测试另一个片段时,一切正常。
所以总结一下:
EventBus
当使用从一个(非常简单的)线程向片段发送值时,一切正常,而从另一个(更复杂的)线程发送以冻结显示并显示内存分配图结束。重要的是要知道,如果一个线程正在运行,第二个线程将被注释掉。
有人可以告诉我这里可能有什么问题吗?或者我应该检查更多?
编辑
我又做了一项测试,将有关系列数据的所有内容都注释掉,只留下Log.d()
,没有出现错误。有趣的是,图形更新的阻塞(或冻结)不会影响 UI 本身,所以我仍然可以按下所有按钮等等。