私の最初の質問は次のとおりでした: Android GraphView project get freeze with real time updates。これでは、3 つのプロットの UI スレッドで可能な同時実行について質問していました。メモリ割り当てプロットでは、次のようになります。
私はProcessThread
主な活動から直接データを受け取り、それをライブラリonEventMainThread
から. 渡されるすべてのデータは、Bluetooth リスニング サービスからデータを収集し、それを処理して意味のある数値を取得します。EventBus
GraphFragment
ProcessThread
私の考えは、データを生成してに送信するだけのテストスレッドでこれと同じことが起こるかどうかをテストすることでしたonEventMainThread
。これもいくつかのエラーを生成するため、別の質問をすることを余儀なくされました: Difficulty in Understanding 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++;
}
残念ながら、最初に戻ったときに問題が再び発生しました。多くのテストの後、データが正しく送信されているように見えると言えます。私は2つのマーカーでそれをチェックしました:
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 ビジュアライゼーションを使用して別のフラグメントをテストしたときにすべてが機能するため、データが常に正しく送信されていると確信しています。
すべてを要約すると、次のようになります。
1 つの (非常に単純な) スレッドからフラグメントに値を送信すると、EventBus
すべてがうまく機能しますが、別の (より複雑な) スレッドから送信すると、表示がフリーズし、メモリ割り当てグラフが表示されます。1 つのスレッドが実行されている場合、2 番目のスレッドはコメントアウトされていることに注意してください。
誰かがここで何が問題なのかアドバイスしてもらえますか? または、何をさらに確認する必要がありますか?
編集
シリーズデータの追加に関するすべてをコメントアウトしてLog.d()
、エラーが発生しないようにして、もう1つのテストを行いました。興味深いのは、グラフ更新のブロック (またはフリーズ) が UI 自体に影響を与えないため、すべてのボタンなどを押し続けることができることです。