Неожиданное поведение одних и тех же методов в разных потоках

Мой первый вопрос был: 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, и она работала как шарм.

Другие вопросы по тегам