Java Android线程似乎不起作用

Java Android线程似乎不起作用,java,android,android-studio,Java,Android,Android Studio,在我现在正在使用的调谐器应用程序中,我想实现一个指示器,显示是否播放了正确的音调。为此,我实现了指示器的颜色只有在我保持音高至少2秒时才会改变 public void thr(final double v1, final double v2) { new Thread() { @Override public void run() { super.run(); int i = 0;

在我现在正在使用的调谐器应用程序中,我想实现一个指示器,显示是否播放了正确的音调。为此,我实现了指示器的颜色只有在我保持音高至少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();
public void thr(最终双倍v1,最终双倍v2){
新线程(){
@凌驾
公开募捐{
super.run();
int i=0;
而(pitchInHz>=v1&&pitchInHz
每次我的应用程序尝试使用线程时,应用程序都会崩溃。 为什么会发生这种情况

        if(pitchInHz >= 72.41 && pitchInHz < 92.41) {
        //e
        noteText.setText("e"); //this is working
        if(!running) {
            thr(72.41, 92.41);
            running = true;
        }
if(pitchInHz>=72.41&&pitchInHz<92.41){
//e
noteText.setText(“e”);//这正在工作
如果(!正在运行){
thr(72.41,92.41);
运行=真;
}

我猜想这是因为您试图从不同于主线程的线程访问视图,而您不能这样做

试着像这样跑步:

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();
public void thr(最终双倍v1,最终双倍v2){
新线程(){
@凌驾
公开募捐{
super.run();
int i=0;
而(pitchInHz>=v1&&pitchInHz
错误消息是什么?为什么后台线程是必需的?显然这可以用更可靠的方法完成??