用户第二次启动线程时发生IllegalStateException

时间:2019-06-30 15:38:43

标签: java android multithreading illegalstateexception

我正在为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() + "------");
            }

        }
    });

有人可以建议我该怎么做

1 个答案:

答案 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个线程。让线程结束!