重新启动完成的线程导致崩溃(Android SDK)

时间:2012-12-12 20:26:19

标签: java android multithreading

标题几乎解释了这个问题。

我有一个按钮,当我按下切换此线程时。它会成功打开和关闭......一旦它再次打开就会崩溃。

private Thread dataThread = new Thread(new Runnable(){
    public void run() {
        while(transmitPackets){
                Log.d("Test","DERP");
        }
    }
});

以及它的运行......

toggleButton.setOnClickListener( new View.OnClickListener() {
        public void onClick(View v){
            transmitPackets = !transmitPackets;
            if( transmitPackets ) {
                toggleButton.setText("Pause");
                dataThread.start();
            }
            else {
                toggleButton.setText("Transmit");
            }
        }
    });

transmitPackets是按下按钮切换的布尔值。这样命名是因为这个应用程序最终将通过网络发送数据。线程也使用它来终止。

应用程序崩溃产生的堆栈跟踪在确定如何解决它时并不是特别有用,因为它只是说它在重新启动线程时崩溃 - 问题本身很明显。

我是Android SDK的新手,也是Java的线程,所以我不知道哪里出错了。这似乎是一个最简单的线程实现,这是我在尝试做任何与线程无关的事情之前的开始。

4 个答案:

答案 0 :(得分:2)

  

它成功打开和关闭...一次,如果我再次尝试打开它会崩溃。

事实上。您无法启动已完成的线程。您需要创建一个新线程,然后启动它。

请注意,您无法重新启动已经启动过的线程的信息应该来自:

  • 堆栈跟踪
  • documentation

      

    如果在

    之前启动了线程,则抛出IllegalThreadStateException

当某些事情导致异常时,您应该始终读取异常消息(以及堆栈跟踪,因为可能存在因果信息)和文档。

答案 1 :(得分:2)

一旦线程完成,它就消失了。你无法重启。您可能需要创建新线程。没有堆栈跟踪,很难提出任何建议。

在线程上调用start()并不意味着您正在重新启动线程。这意味着你正在开始新的线程。

问题可能是别的。后堆栈跟踪。

答案 2 :(得分:1)

您需要将DataThread代码移动到setOnClickListener代码中,因为您只创建了一个线程,所以当您再次'开始'时,它就不会像现在这样完成。您应该声明DataThread现在所处的位置,但在侦听器中设置它

答案 3 :(得分:0)

更好的实施将是

private Thread dataThread = new Thread(new Runnable(){
public void run() {
    while(true){

    if(transmitPackets){
       Log.d("Test","DERP");
       transmitPackets = false;
    }
  }
}
});

线程继续前进,你所做的就是改变真值 transmitPackets值,因此它将运行