в приложении тюнера, над которым я сейчас работаю, я хотел реализовать индикатор, который показывает, играет ли правильная высота тона. Для этого я реализовал, что цвет индикатора меняется только тогда, когда я удерживаю высоту звука не менее 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;
}
Зачем вообще нужен фоновый поток? Ясно, что это можно было сделать более надежным способом ??




Я предполагаю, что это потому, что вы пытаетесь получить доступ к представлению из другого потока, чем основной поток, а вы не можете этого сделать.
Попробуйте бегать вот так:
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();
Что за сообщение об ошибке?