Ответ 1
Вы должны проверить состояние этого потока перед его запуском.
if (thread.getState() == Thread.State.NEW)
{
thread.start();
}
У меня есть Thrad и Handler:
Handler handler = new Handler() {
@Override
public void handleMessage(android.os.Message msg) {
super.handleMessage(msg);
//do somethink
}
};
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
//do somethink
msg.obj = 1;
handler.sendMessage(msg);
thread.interrupt();
}
});
Когда приложение запускается, в первый раз thread.start(); все работает нормально. Но когда я пытаюсь запустить thread.start(); второй раз с кнопки у меня есть:
E/MessageQueue-JNI: java.lang.IllegalThreadStateException: поток уже запущен.
Вы должны проверить состояние этого потока перед его запуском.
if (thread.getState() == Thread.State.NEW)
{
thread.start();
}
Это не хорошая идея начать тему более одного раза. Вы должны проверить, запущен ли нить или нет. если Thread еще не запущен
if(!thread.isAlive()){
thread.start();
}
Лучшая идея - создать Создать новый поток.
В конце run() ваш поток умирает. Если вы хотите сохранить его в живых, добавьте блокирующую очередь в поток и сделайте run() большой цикл while, который читается из очереди. Вместо того, чтобы вызывать начало для каждого сообщения, просто добавьте его в очередь.
Конечно, вам все равно нужно вызвать start() один раз (когда ваша программа инициализируется).