我正在为Android构建一个简单的messanger应用程序,并且在发送文本消息时遇到一些问题。 第一次使用OnlickListener时,消息已发送并显示在列表视图中。当我第二次尝试该活动时,我的应用程序崩溃,并出现IllegalStateException。
我对线程不是很了解,这是我唯一一次需要在客户端重新启动线程
这是我遇到问题的部分代码
sendbutton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (editText.getText().toString().length() == 0) {
System.out.println("Keine Nachricht zum versenden
vorhanden");
return;
} else {
if(!threadTextMessage.isAlive())
threadTextMessage.start();
}
}
});
threadTextMessage = new Thread(new Runnable() {
@Override
public void run() {
String name = filesystem.readFileLine("usr.txt", 0);
String password = filesystem.readFileLine("usr.txt", 1);
//benötigter recipient ist Instanzvariable
String mimetype = "text/plain";
String data = editText.getText().toString();
try {
message = post("http://palaver.se.paluno.uni-
due.de/api/message/send", buildJson(name, password, recipient, mimetype,
data));
System.out.println("Sende Nachricht:< {\"Username\":\"" +
name + "\", \"Password\":\"" + password + "\", \"Recipient\":\"" +
recipient + "\", \"Mimetype\":\"" + mimetype + "\", \"Data\":\"" + data +
"\"}");
runOnUiThread(new Runnable() {
@Override
public void run() {
editText.getText().clear();
}
});
threadTextMessage.interrupt();
} catch (Exception e) {
System.out.println("-----" + e.toString() + "------");
}
}
});
有人可以建议我该怎么做
答案 0 :(得分:2)
您不能两次启动线程。第一次启动线程,最后将其中断。但是第二次您在与之前相同的对象上调用start()方法。每次要启动线程时,都需要创建一个新的对象。即使我有点困惑“ isAlive()”不能防止错误,但这仍然是问题所在。
所以在您的情况下:
threadTextMessage = new Thread(new Runnable() {
@Override
public void run() {
String name = filesystem.readFileLine("usr.txt", 0);
String password = filesystem.readFileLine("usr.txt", 1);
//benötigter recipient ist Instanzvariable
String mimetype = "text/plain";
String data = editText.getText().toString();
try {
message = post("http://palaver.se.paluno.uni-
due.de/api/message/send", buildJson(name, password, recipient, mimetype,
data));
System.out.println("Sende Nachricht:< {\"Username\":\"" +
name + "\", \"Password\":\"" + password + "\", \"Recipient\":\"" +
recipient + "\", \"Mimetype\":\"" + mimetype + "\", \"Data\":\"" + data +
"\"}");
runOnUiThread(new Runnable() {
@Override
public void run() {
editText.getText().clear();
}
});
} catch (Exception e) {
System.out.println("-----" + e.toString() + "------");
}
}
});
每次启动胎面之前都必须完成此创建。或者最好将其放在一个自己的类中,因此您只需要创建一个对象即可。 但是,请删除interupt()调用,否则在创建10个对象之后,您可能需要等待10个线程。让线程结束!