0

Мой первоначальный вопрос: Android GraphView project get freeze with real time updates. В этом я спрашивал о возможном параллелизме в потоке пользовательского интерфейса из 3 графиков. На участке выделения памяти выглядит следующим образом:Неожиданное поведение тех же методов в разных потоках

enter image description here

Я получал данные непосредственно от моего 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() и не появилось никаких ошибок. Интересно, что блокировка (или замораживание) обновлений графа не влияет на пользовательский интерфейс, поэтому я все еще могу нажать все кнопки и так далее.

+0

если вы можете нажимать кнопки, чем вы знаете, что приложение замерзает? –

+0

также попытайтесь увеличить время бит 10 мс еще слишком высоко .. попробуйте около 100 мс –

ответ

0

Вы пробовали использовать пользовательский eventbus, а не стандартный? У меня была подобная проблема сегодня, и я исправил это, создав обычную платформу с отдельными ThreadPool, и это сработало как шарм.

Смежные вопросы