Неожиданное поведение одних и тех же методов в разных потоках
Мой первый вопрос был: Android GraphView заморозить с обновлениями в реальном времени. В этом я спрашивал о возможном параллелизме в потоке пользовательского интерфейса из 3 графиков. На графике распределения памяти это выглядит так:
Я получал данные непосредственно от моего ProcessThread
в основной деятельности и передать его с помощью onEventMainThread
от EventBus
библиотека обратно в GraphFragment
, Все данные, которые передаются от ProcessThread
который собирает данные из службы прослушивания Bluetooth, а затем обрабатывает их, чтобы получить значимые цифры.
Моя идея состояла в том, чтобы проверить, произойдет ли то же самое с тестовым потоком, который только генерирует данные и отправляет их onEventMainThread
, Поскольку это также приводит к некоторым ошибкам, я был вынужден задать еще один вопрос: трудности в понимании сложной многопоточности в приложении Android. Через некоторое время я получил отличный ответ от @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()
и никакой ошибки не появилось. Интересно то, что блокировка (или зависание) обновлений графика не влияет на сам интерфейс, поэтому я все еще могу нажимать все кнопки и так далее.
1 ответ
Вы пытались использовать пользовательскую шину событий, а не по умолчанию? Сегодня у меня была похожая проблема, и я исправил ее, создав собственную шину Evenbus с отдельным ThreadPool, и она работала как шарм.