我正在为 Android 构建一个简单的消息应用程序,并且在发送短信时遇到一些问题。 我第一次使用 OnlickListener 时,消息被发送并显示在我的 ListView 中。当我在 Activity 中第二次尝试时,我的应用程序因 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() + "------");
}
}
});
有人可以建议我该怎么做吗
最佳答案
一个线程不能启动两次。第一次启动线程并在最后中断它。但是第二次您在与之前相同的对象上调用 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 个线程等待。让线程完成!
关于java - 用户第二次启动线程时出现 IllegalStateException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56826108/