Android Thread кажется не работает

в приложении тюнера, над которым я сейчас работаю, я хотел реализовать индикатор, который показывает, играет ли правильная высота тона. Для этого я реализовал, что цвет индикатора меняется только тогда, когда я удерживаю высоту звука не менее 2 секунд.

    public void thr(final double v1, final double v2) {
    new Thread() {
        @Override
        public void run() {
            super.run();
            int i = 0;
            while (pitchInHz >= v1 && pitchInHz < v2) {
                if (i == 20){    //2 Sekunden
                    imageView.setBackgroundColor(getResources().getColor(holo_green_light));
                }else {
                    imageView.setBackgroundColor(getResources().getColor(darker_gray));
                    try {
                        sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    i++;
                }
            }
            running = false;
        }
    }.start();

Каждый раз, когда мое приложение пытается использовать поток, оно просто аварийно завершает работу. какие идеи почему это происходит?

        if (pitchInHz >= 72.41 && pitchInHz < 92.41) {
        //e
        noteText.setText("e"); //this is working
        if (!running) {
            thr(72.41, 92.41);
            running = true;
        }

Что за сообщение об ошибке?

leonardkraemer 31.03.2018 00:00

Зачем вообще нужен фоновый поток? Ясно, что это можно было сделать более надежным способом ??

EpicPandaForce 31.03.2018 00:07
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
2
33
1

Ответы 1

Я предполагаю, что это потому, что вы пытаетесь получить доступ к представлению из другого потока, чем основной поток, а вы не можете этого сделать.

Попробуйте бегать вот так:

public void thr(final double v1, final double v2) {
new Thread() {
    @Override
    public void run() {
        super.run();
        int i = 0;
        while (pitchInHz >= v1 && pitchInHz < v2) {
            if (i == 20){    //2 Sekunden
                runOnUiThread(new Runnable() {
                    @override
                    public void run() {
                        imageView.setBackgroundColor(getResources().getColor(holo_green_light));
                    }
                })

            }else {
                runOnUiThread(new Runnable() {
                    @override
                    public void run() {
                        imageView.setBackgroundColor(getResources().getColor(darker_gray));
                    }
                })
                try {
                    sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                i++;
            }
        }
        running = false;
    }
}.start();

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