java:为什么当我尝试重新启动线程时我的应用程序崩溃了?

时间:2020-06-02 10:46:17

标签: java android multithreading

因此,我正在编写一个可以远程控制另一台设备的灯光的应用程序。现在我想有一个计时器,只要打开灯,它就会运行,而当我再次关闭它们时,它会停止运行。

现在第一次可以很好地工作:这意味着当我第一次打开灯时,计时器开始运转,当我关闭灯时,它会停止。但是,当我再次尝试执行此操作时,应用程序崩溃了。任何人都不知道问题可能在哪里吗?

这是我的代码:


 //thread for the timer it's in the onCreate method
        t = new Thread()
        {
            @Override
            public void run(){

                while(!(t.isInterrupted())){

                    try {
                        Thread.sleep(1000);  //1000ms = 1 sec

                        runOnUiThread(new Runnable() {

                            @Override
                            public void run() {
                                runningtime++;
                                runningTime.setText("Running since: " + String.valueOf(runningtime) + "seconds" );
                            }
                        });

                    } catch (InterruptedException e) {
                        t.interrupt();
                    }

                }
            }
        };
    }

//the buttons and the button listeners 

    final Button buttonOn = findViewById(R.id.lightOn);
        buttonOn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                // Code here executes on main thread after user presses button
                turnLightOn();
                //timer-thread gets started
                t.start();
                test.setText("Status: ON");
            }
        });


        final Button buttonOff = findViewById(R.id.lightOff);
        buttonOff.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                // Code here executes on main thread after user presses button
                turnLightOff();
                //timer thread gets interrupted
                t.interrupt();
                test.setText("Status: OFF");
            }
        });

1 个答案:

答案 0 :(得分:0)

您根本无法在Java中重新启动线程

来自https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html的Java API文档

启动一个线程永远不合法。特别是 完成执行后,线程可能无法重新启动。

基本上,您将希望使用与上面显示的相同的逻辑来重新创建此线程。将其放入返回Thread的新方法中,然后从onClick调用该新方法以填充t可能很有意义。 但是请当心有人敲击单击按钮,这可能会导致奇怪的行为。

 //thread for the timer it's in the onCreate method
public Thread makeNewThread() {
        return new Thread()
        {
            @Override
            public void run(){

                while(!(t.isInterrupted())){

                    try {
                        Thread.sleep(1000);  //1000ms = 1 sec

                        runOnUiThread(new Runnable() {

                            @Override
                            public void run() {
                                runningtime++;
                                runningTime.setText("Running since: " + String.valueOf(runningtime) + "seconds" );
                            }
                        });

                    } catch (InterruptedException e) {
                        t.interrupt();
                    }

                }
            }
        };
    }

}