标题几乎解释了这个问题。
我有一个按钮,当我按下切换此线程时。它会成功打开和关闭......一旦它再次打开就会崩溃。
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的线程,所以我不知道哪里出错了。这似乎是一个最简单的线程实现,这是我在尝试做任何与线程无关的事情之前的开始。
答案 0 :(得分:2)
它成功打开和关闭...一次,如果我再次尝试打开它会崩溃。
事实上。您无法启动已完成的线程。您需要创建一个新线程,然后启动它。
请注意,您无法重新启动已经启动过的线程的信息应该来自:
如果在
之前启动了线程,则抛出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值,因此它将运行