Мой первоначальный вопрос: Android GraphView project get freeze with real time updates. В этом я спрашивал о возможном параллелизме в потоке пользовательского интерфейса из 3 графиков. На участке выделения памяти выглядит следующим образом:Неожиданное поведение тех же методов в разных потоках
Я получал данные непосредственно от моего ProcessThread
в основной деятельности и передать его с помощью onEventMainThread
из EventBus
библиотеки обратно в GraphFragment
. Все данные, которые передаются, поступают от ProcessThread
, который собирает данные из службы прослушивания Bluetooth, а затем продолжает получать значимые номера.
Моя идея состояла в том, чтобы проверить, произойдет ли это с тестовым потоком, который генерирует только данные и отправляет их в onEventMainThread
. Поскольку это также приводит к некоторым ошибкам, я был вынужден задать другой вопрос: Difficulty in understanding complex multi threading in Android app. Через некоторое время я получил отличный answer от @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");
}
Сообщения журнала отображаются корректно. К сожалению, ошибка появляется, даже если посылающих выглядит это же, как и в моей тестовой теме:
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
от одного (очень простого) нити все работает отлично, при отправке из других (более сложного) нити заканчивается в замораживании дисплея и показал память график распределения. Важно знать, что если один поток работает, то второй закомментирован.
Может кто-нибудь, пожалуйста, посоветуйте мне, что может быть проблемой здесь? Или что я должен проверить?
EDIT
Я сделал еще один тест с закомментировать все о данных серии присоединять оставив только Log.d()
и не появилось никаких ошибок. Интересно, что блокировка (или замораживание) обновлений графа не влияет на пользовательский интерфейс, поэтому я все еще могу нажать все кнопки и так далее.
если вы можете нажимать кнопки, чем вы знаете, что приложение замерзает? –
также попытайтесь увеличить время бит 10 мс еще слишком высоко .. попробуйте около 100 мс –