Android - остановка потока с помощью цикла while - PullRequest
1 голос
/ 09 сентября 2011

Странная проблема, которая, кажется, упоминалась здесь несколько раз. У меня есть поток, я также использовал AsyncTask, и я пытаюсь заставить его перестать работать, по запросу пользователей. Поэтому, естественно, я использую логическое значение в цикле while. Поток всегда воспринимает это логическое значение как истинное, даже если он печатает false в другом месте.

Код указан ниже, и любая помощь приветствуется!

/**
 * Opens new socket and listens on the specified port until a user stops the thread, the logview is updated with messages
 */
public void run() {
    byte[] receiveData = new byte[1024];
    byte[] sendData = new byte[1024];
    Log.e("Text2Server", "Starting Server");
    this.running = true;
    while(this.running) {
        Log.i("Text2Server", "Server should be running: " +  running);
        try {
            serverSocket = new DatagramSocket(port);
        } catch (SocketException e1) {
            e1.printStackTrace();
        }
        try {   
            DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
            serverSocket.receive(receivePacket);
            final String fromIP = new String(receivePacket.getAddress().toString());
            final int fromPort = receivePacket.getPort();
            final String received = new String(receivePacket.getData());
            Date now = new Date();
            final String logput = DateFormat.getDateTimeInstance().format(now) + " - Message from: " + fromIP + " through Port: " + fromPort + " with Message: " + received;
            Log.i("Text2Server", logput);
            //All UI Operations are done in this thread
            uiHandler.post(new Runnable(){
                @Override
                public void run() {
                    logTextView.append(logput);
                }                   
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    serverSocket.close();
}

public void stopThread() {
    this.running = false;
    Log.i("Text2Server", "Stopping Server, value is now: " + running);
}

Вызов stopThread () делает его ложным, но поток все еще входит в while и выводит true. Есть мысли?

Спасибо!

1 Ответ

1 голос
/ 09 сентября 2011

Возможные причины:

1) Вы создали более одной нити и закрыли только одну из них.

2) Вы вызываете stopThread до запуска потока.

3) Поток поставил в очередь много вызовов logTextView.append(logput) в потоке пользовательского интерфейса, и поэтому , по-видимому, продолжает работать.

...