不同线程中相同方法的意外行为

时间:2015-05-26 12:40:09

标签: android multithreading android-graphview greenrobot-eventbus

我最初的问题是:Android GraphView project get freeze with real time updates。在这篇文章中,我询问了3个图的UI线程中可能的并发性。在内存分配图上,它看起来像这样:

enter image description here

我直接从主要活动中的ProcessThread接收数据,并使用onEventMainThreadEventBus库将其传递回GraphFragment。传递的所有数据都来自ProcessThread,它从蓝牙监听服务收集数据,然后继续获取有意义的数字。

我的想法是测试是否会在测试线程中发生同样的情况,测试线程只生成数据并将其发送到onEventMainThread。因为这也会产生一些错误,我不得不提出另一个问题:Difficulty in understanding complex multi threading in Android app。过了一段时间,我从@AsifMujteba收到了很棒的answer来解释我的测试线程太快了。

知道我能够回到我的主要问题和我的真实线程来检查所有时间是否正确。正如我所说,有很多事情发生,因此禁止快速不是问题(但是,我已经添加了相同的机制来测试数据是否发送到快速)。我会更加担心这个线程的工作变慢。

我当前的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本身,所以我仍然可以按下所有按钮等等。

1 个答案:

答案 0 :(得分:0)

您是否尝试使用自定义事件总线而不是默认事件总线? 我今天遇到了一个类似的问题,我通过使用单独的ThreadPool创建一个自定义的evenbus来解决这个问题,它就像一个魅力。