-1

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

我有一个按钮,当我按下时可以打开/关闭这个线程。它成功地打开和关闭它......一次,然后如果我尝试再次打开它,它就会崩溃。

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

4 回答 4

2

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

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

请注意,您无法重新启动已经启动的线程的信息应该已经从以下位置清楚地显示:

  • 堆栈跟踪
  • 文档:_

    IllegalThreadStateException如果线程之前已启动,则抛出

当某事导致异常时,您应该始终仔细阅读异常消息(和堆栈跟踪,因为那里可能存在因果信息)和文档。

于 2012-12-12T20:30:32.730 回答
2

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

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

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

于 2012-12-12T20:30:56.773 回答
1

您需要将DataThread代码移动到setOnClickListener代码中,因为您只创建一个线程,因此当您再次“启动”它时,它不能,因为它已经完成了。你应该声明DataThread你现在在哪里,但在监听器中设置它

于 2012-12-12T20:31:12.520 回答
0

更好的实施将是

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

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

这样线程继续运行,你所做的就是改变传输包值的真值,这样它就会运行

于 2012-12-12T20:38:25.133 回答